Thanks for using Compiler Explorer
Sponsors
Jakt
C++
Ada
Algol68
Analysis
Android Java
Android Kotlin
Assembly
C
C3
Carbon
C with Coccinelle
C++ with Coccinelle
C++ (Circle)
CIRCT
Clean
Clojure
CMake
CMakeScript
COBOL
C++ for OpenCL
MLIR
Cppx
Cppx-Blue
Cppx-Gold
Cpp2-cppfront
Crystal
C#
CUDA C++
D
Dart
Elixir
Erlang
Fortran
F#
GLSL
Go
Haskell
HLSL
Hook
Hylo
IL
ispc
Java
Julia
Kotlin
LLVM IR
LLVM MIR
Modula-2
Mojo
Nim
Numba
Nix
Objective-C
Objective-C++
OCaml
Odin
OpenCL C
Pascal
Pony
PTX
Python
Racket
Raku
Ruby
Rust
Sail
Snowball
Scala
Slang
Solidity
Spice
SPIR-V
Swift
LLVM TableGen
Toit
Triton
TypeScript Native
V
Vala
Visual Basic
Vyper
WASM
Yul (Solidity IR)
Zig
Javascript
GIMPLE
Ygen
sway
c++ source #1
Output
Compile to binary object
Link to binary
Execute the code
Intel asm syntax
Demangle identifiers
Verbose demangling
Filters
Unused labels
Library functions
Directives
Comments
Horizontal whitespace
Debug intrinsics
Compiler
6502-c++ 11.1.0
ARM GCC 10.2.0
ARM GCC 10.3.0
ARM GCC 10.4.0
ARM GCC 10.5.0
ARM GCC 11.1.0
ARM GCC 11.2.0
ARM GCC 11.3.0
ARM GCC 11.4.0
ARM GCC 12.1.0
ARM GCC 12.2.0
ARM GCC 12.3.0
ARM GCC 12.4.0
ARM GCC 12.5.0
ARM GCC 13.1.0
ARM GCC 13.2.0
ARM GCC 13.2.0 (unknown-eabi)
ARM GCC 13.3.0
ARM GCC 13.3.0 (unknown-eabi)
ARM GCC 13.4.0
ARM GCC 13.4.0 (unknown-eabi)
ARM GCC 14.1.0
ARM GCC 14.1.0 (unknown-eabi)
ARM GCC 14.2.0
ARM GCC 14.2.0 (unknown-eabi)
ARM GCC 14.3.0
ARM GCC 14.3.0 (unknown-eabi)
ARM GCC 15.1.0
ARM GCC 15.1.0 (unknown-eabi)
ARM GCC 15.2.0
ARM GCC 15.2.0 (unknown-eabi)
ARM GCC 4.5.4
ARM GCC 4.6.4
ARM GCC 5.4
ARM GCC 6.3.0
ARM GCC 6.4.0
ARM GCC 7.3.0
ARM GCC 7.5.0
ARM GCC 8.2.0
ARM GCC 8.5.0
ARM GCC 9.3.0
ARM GCC 9.4.0
ARM GCC 9.5.0
ARM GCC trunk
ARM gcc 10.2.1 (none)
ARM gcc 10.3.1 (2021.07 none)
ARM gcc 10.3.1 (2021.10 none)
ARM gcc 11.2.1 (none)
ARM gcc 5.4.1 (none)
ARM gcc 7.2.1 (none)
ARM gcc 8.2 (WinCE)
ARM gcc 8.3.1 (none)
ARM gcc 9.2.1 (none)
ARM msvc v19.0 (ex-WINE)
ARM msvc v19.10 (ex-WINE)
ARM msvc v19.14 (ex-WINE)
ARM64 Morello gcc 10.1 Alpha 2
ARM64 gcc 10.2
ARM64 gcc 10.3
ARM64 gcc 10.4
ARM64 gcc 10.5.0
ARM64 gcc 11.1
ARM64 gcc 11.2
ARM64 gcc 11.3
ARM64 gcc 11.4.0
ARM64 gcc 12.1
ARM64 gcc 12.2.0
ARM64 gcc 12.3.0
ARM64 gcc 12.4.0
ARM64 gcc 12.5.0
ARM64 gcc 13.1.0
ARM64 gcc 13.2.0
ARM64 gcc 13.3.0
ARM64 gcc 13.4.0
ARM64 gcc 14.1.0
ARM64 gcc 14.2.0
ARM64 gcc 14.3.0
ARM64 gcc 15.1.0
ARM64 gcc 15.2.0
ARM64 gcc 4.9.4
ARM64 gcc 5.4
ARM64 gcc 5.5.0
ARM64 gcc 6.3
ARM64 gcc 6.4
ARM64 gcc 7.3
ARM64 gcc 7.5
ARM64 gcc 8.2
ARM64 gcc 8.5
ARM64 gcc 9.3
ARM64 gcc 9.4
ARM64 gcc 9.5
ARM64 gcc trunk
ARM64 msvc v19.14 (ex-WINE)
AVR gcc 10.3.0
AVR gcc 11.1.0
AVR gcc 12.1.0
AVR gcc 12.2.0
AVR gcc 12.3.0
AVR gcc 12.4.0
AVR gcc 12.5.0
AVR gcc 13.1.0
AVR gcc 13.2.0
AVR gcc 13.3.0
AVR gcc 13.4.0
AVR gcc 14.1.0
AVR gcc 14.2.0
AVR gcc 14.3.0
AVR gcc 15.1.0
AVR gcc 15.2.0
AVR gcc 4.5.4
AVR gcc 4.6.4
AVR gcc 5.4.0
AVR gcc 9.2.0
AVR gcc 9.3.0
Arduino Mega (1.8.9)
Arduino Uno (1.8.9)
BPF clang (trunk)
BPF clang 13.0.0
BPF clang 14.0.0
BPF clang 15.0.0
BPF clang 16.0.0
BPF clang 17.0.1
BPF clang 18.1.0
BPF clang 19.1.0
BPF clang 20.1.0
BPF clang 21.1.0
EDG (experimental reflection)
EDG 6.5
EDG 6.5 (GNU mode gcc 13)
EDG 6.6
EDG 6.6 (GNU mode gcc 13)
EDG 6.7
EDG 6.7 (GNU mode gcc 14)
FRC 2019
FRC 2020
FRC 2023
HPPA gcc 14.2.0
HPPA gcc 14.3.0
HPPA gcc 15.1.0
HPPA gcc 15.2.0
KVX ACB 4.1.0 (GCC 7.5.0)
KVX ACB 4.1.0-cd1 (GCC 7.5.0)
KVX ACB 4.10.0 (GCC 10.3.1)
KVX ACB 4.11.1 (GCC 10.3.1)
KVX ACB 4.12.0 (GCC 11.3.0)
KVX ACB 4.2.0 (GCC 7.5.0)
KVX ACB 4.3.0 (GCC 7.5.0)
KVX ACB 4.4.0 (GCC 7.5.0)
KVX ACB 4.6.0 (GCC 9.4.1)
KVX ACB 4.8.0 (GCC 9.4.1)
KVX ACB 4.9.0 (GCC 9.4.1)
KVX ACB 5.0.0 (GCC 12.2.1)
KVX ACB 5.2.0 (GCC 13.2.1)
LoongArch64 clang (trunk)
LoongArch64 clang 17.0.1
LoongArch64 clang 18.1.0
LoongArch64 clang 19.1.0
LoongArch64 clang 20.1.0
LoongArch64 clang 21.1.0
M68K gcc 13.1.0
M68K gcc 13.2.0
M68K gcc 13.3.0
M68K gcc 13.4.0
M68K gcc 14.1.0
M68K gcc 14.2.0
M68K gcc 14.3.0
M68K gcc 15.1.0
M68K gcc 15.2.0
M68k clang (trunk)
MRISC32 gcc (trunk)
MSP430 gcc 4.5.3
MSP430 gcc 5.3.0
MSP430 gcc 6.2.1
MinGW clang 14.0.3
MinGW clang 14.0.6
MinGW clang 15.0.7
MinGW clang 16.0.0
MinGW clang 16.0.2
MinGW gcc 11.3.0
MinGW gcc 12.1.0
MinGW gcc 12.2.0
MinGW gcc 13.1.0
MinGW gcc 14.3.0
MinGW gcc 15.2.0
RISC-V (32-bits) gcc (trunk)
RISC-V (32-bits) gcc 10.2.0
RISC-V (32-bits) gcc 10.3.0
RISC-V (32-bits) gcc 11.2.0
RISC-V (32-bits) gcc 11.3.0
RISC-V (32-bits) gcc 11.4.0
RISC-V (32-bits) gcc 12.1.0
RISC-V (32-bits) gcc 12.2.0
RISC-V (32-bits) gcc 12.3.0
RISC-V (32-bits) gcc 12.4.0
RISC-V (32-bits) gcc 12.5.0
RISC-V (32-bits) gcc 13.1.0
RISC-V (32-bits) gcc 13.2.0
RISC-V (32-bits) gcc 13.3.0
RISC-V (32-bits) gcc 13.4.0
RISC-V (32-bits) gcc 14.1.0
RISC-V (32-bits) gcc 14.2.0
RISC-V (32-bits) gcc 14.3.0
RISC-V (32-bits) gcc 15.1.0
RISC-V (32-bits) gcc 15.2.0
RISC-V (32-bits) gcc 8.2.0
RISC-V (32-bits) gcc 8.5.0
RISC-V (32-bits) gcc 9.4.0
RISC-V (64-bits) gcc (trunk)
RISC-V (64-bits) gcc 10.2.0
RISC-V (64-bits) gcc 10.3.0
RISC-V (64-bits) gcc 11.2.0
RISC-V (64-bits) gcc 11.3.0
RISC-V (64-bits) gcc 11.4.0
RISC-V (64-bits) gcc 12.1.0
RISC-V (64-bits) gcc 12.2.0
RISC-V (64-bits) gcc 12.3.0
RISC-V (64-bits) gcc 12.4.0
RISC-V (64-bits) gcc 12.5.0
RISC-V (64-bits) gcc 13.1.0
RISC-V (64-bits) gcc 13.2.0
RISC-V (64-bits) gcc 13.3.0
RISC-V (64-bits) gcc 13.4.0
RISC-V (64-bits) gcc 14.1.0
RISC-V (64-bits) gcc 14.2.0
RISC-V (64-bits) gcc 14.3.0
RISC-V (64-bits) gcc 15.1.0
RISC-V (64-bits) gcc 15.2.0
RISC-V (64-bits) gcc 8.2.0
RISC-V (64-bits) gcc 8.5.0
RISC-V (64-bits) gcc 9.4.0
RISC-V rv32gc clang (trunk)
RISC-V rv32gc clang 10.0.0
RISC-V rv32gc clang 10.0.1
RISC-V rv32gc clang 11.0.0
RISC-V rv32gc clang 11.0.1
RISC-V rv32gc clang 12.0.0
RISC-V rv32gc clang 12.0.1
RISC-V rv32gc clang 13.0.0
RISC-V rv32gc clang 13.0.1
RISC-V rv32gc clang 14.0.0
RISC-V rv32gc clang 15.0.0
RISC-V rv32gc clang 16.0.0
RISC-V rv32gc clang 17.0.1
RISC-V rv32gc clang 18.1.0
RISC-V rv32gc clang 19.1.0
RISC-V rv32gc clang 20.1.0
RISC-V rv32gc clang 21.1.0
RISC-V rv32gc clang 9.0.0
RISC-V rv32gc clang 9.0.1
RISC-V rv64gc clang (trunk)
RISC-V rv64gc clang 10.0.0
RISC-V rv64gc clang 10.0.1
RISC-V rv64gc clang 11.0.0
RISC-V rv64gc clang 11.0.1
RISC-V rv64gc clang 12.0.0
RISC-V rv64gc clang 12.0.1
RISC-V rv64gc clang 13.0.0
RISC-V rv64gc clang 13.0.1
RISC-V rv64gc clang 14.0.0
RISC-V rv64gc clang 15.0.0
RISC-V rv64gc clang 16.0.0
RISC-V rv64gc clang 17.0.1
RISC-V rv64gc clang 18.1.0
RISC-V rv64gc clang 19.1.0
RISC-V rv64gc clang 20.1.0
RISC-V rv64gc clang 21.1.0
RISC-V rv64gc clang 9.0.0
RISC-V rv64gc clang 9.0.1
Raspbian Buster
Raspbian Stretch
SPARC LEON gcc 12.2.0
SPARC LEON gcc 12.3.0
SPARC LEON gcc 12.4.0
SPARC LEON gcc 12.5.0
SPARC LEON gcc 13.1.0
SPARC LEON gcc 13.2.0
SPARC LEON gcc 13.3.0
SPARC LEON gcc 13.4.0
SPARC LEON gcc 14.1.0
SPARC LEON gcc 14.2.0
SPARC LEON gcc 14.3.0
SPARC LEON gcc 15.1.0
SPARC LEON gcc 15.2.0
SPARC gcc 12.2.0
SPARC gcc 12.3.0
SPARC gcc 12.4.0
SPARC gcc 12.5.0
SPARC gcc 13.1.0
SPARC gcc 13.2.0
SPARC gcc 13.3.0
SPARC gcc 13.4.0
SPARC gcc 14.1.0
SPARC gcc 14.2.0
SPARC gcc 14.3.0
SPARC gcc 15.1.0
SPARC gcc 15.2.0
SPARC64 gcc 12.2.0
SPARC64 gcc 12.3.0
SPARC64 gcc 12.4.0
SPARC64 gcc 12.5.0
SPARC64 gcc 13.1.0
SPARC64 gcc 13.2.0
SPARC64 gcc 13.3.0
SPARC64 gcc 13.4.0
SPARC64 gcc 14.1.0
SPARC64 gcc 14.2.0
SPARC64 gcc 14.3.0
SPARC64 gcc 15.1.0
SPARC64 gcc 15.2.0
TI C6x gcc 12.2.0
TI C6x gcc 12.3.0
TI C6x gcc 12.4.0
TI C6x gcc 12.5.0
TI C6x gcc 13.1.0
TI C6x gcc 13.2.0
TI C6x gcc 13.3.0
TI C6x gcc 13.4.0
TI C6x gcc 14.1.0
TI C6x gcc 14.2.0
TI C6x gcc 14.3.0
TI C6x gcc 15.1.0
TI C6x gcc 15.2.0
TI CL430 21.6.1
Tricore gcc 11.3.0 (EEESlab)
VAX gcc NetBSDELF 10.4.0
VAX gcc NetBSDELF 10.5.0 (Nov 15 03:50:22 2023)
VAX gcc NetBSDELF 12.4.0 (Apr 16 05:27 2025)
WebAssembly clang (trunk)
Xtensa ESP32 gcc 11.2.0 (2022r1)
Xtensa ESP32 gcc 12.2.0 (20230208)
Xtensa ESP32 gcc 14.2.0 (20241119)
Xtensa ESP32 gcc 8.2.0 (2019r2)
Xtensa ESP32 gcc 8.2.0 (2020r1)
Xtensa ESP32 gcc 8.2.0 (2020r2)
Xtensa ESP32 gcc 8.4.0 (2020r3)
Xtensa ESP32 gcc 8.4.0 (2021r1)
Xtensa ESP32 gcc 8.4.0 (2021r2)
Xtensa ESP32-S2 gcc 11.2.0 (2022r1)
Xtensa ESP32-S2 gcc 12.2.0 (20230208)
Xtensa ESP32-S2 gcc 14.2.0 (20241119)
Xtensa ESP32-S2 gcc 8.2.0 (2019r2)
Xtensa ESP32-S2 gcc 8.2.0 (2020r1)
Xtensa ESP32-S2 gcc 8.2.0 (2020r2)
Xtensa ESP32-S2 gcc 8.4.0 (2020r3)
Xtensa ESP32-S2 gcc 8.4.0 (2021r1)
Xtensa ESP32-S2 gcc 8.4.0 (2021r2)
Xtensa ESP32-S3 gcc 11.2.0 (2022r1)
Xtensa ESP32-S3 gcc 12.2.0 (20230208)
Xtensa ESP32-S3 gcc 14.2.0 (20241119)
Xtensa ESP32-S3 gcc 8.4.0 (2020r3)
Xtensa ESP32-S3 gcc 8.4.0 (2021r1)
Xtensa ESP32-S3 gcc 8.4.0 (2021r2)
arm64 msvc v19.20 VS16.0
arm64 msvc v19.21 VS16.1
arm64 msvc v19.22 VS16.2
arm64 msvc v19.23 VS16.3
arm64 msvc v19.24 VS16.4
arm64 msvc v19.25 VS16.5
arm64 msvc v19.27 VS16.7
arm64 msvc v19.28 VS16.8
arm64 msvc v19.28 VS16.9
arm64 msvc v19.29 VS16.10
arm64 msvc v19.29 VS16.11
arm64 msvc v19.30 VS17.0
arm64 msvc v19.31 VS17.1
arm64 msvc v19.32 VS17.2
arm64 msvc v19.33 VS17.3
arm64 msvc v19.34 VS17.4
arm64 msvc v19.35 VS17.5
arm64 msvc v19.36 VS17.6
arm64 msvc v19.37 VS17.7
arm64 msvc v19.38 VS17.8
arm64 msvc v19.39 VS17.9
arm64 msvc v19.40 VS17.10
arm64 msvc v19.41 VS17.11
arm64 msvc v19.42 VS17.12
arm64 msvc v19.43 VS17.13
arm64 msvc v19.latest
armv7-a clang (trunk)
armv7-a clang 10.0.0
armv7-a clang 10.0.1
armv7-a clang 11.0.0
armv7-a clang 11.0.1
armv7-a clang 12.0.0
armv7-a clang 12.0.1
armv7-a clang 13.0.0
armv7-a clang 13.0.1
armv7-a clang 14.0.0
armv7-a clang 15.0.0
armv7-a clang 16.0.0
armv7-a clang 17.0.1
armv7-a clang 18.1.0
armv7-a clang 19.1.0
armv7-a clang 20.1.0
armv7-a clang 21.1.0
armv7-a clang 9.0.0
armv7-a clang 9.0.1
armv8-a clang (all architectural features, trunk)
armv8-a clang (trunk)
armv8-a clang 10.0.0
armv8-a clang 10.0.1
armv8-a clang 11.0.0
armv8-a clang 11.0.1
armv8-a clang 12.0.0
armv8-a clang 13.0.0
armv8-a clang 14.0.0
armv8-a clang 15.0.0
armv8-a clang 16.0.0
armv8-a clang 17.0.1
armv8-a clang 18.1.0
armv8-a clang 19.1.0
armv8-a clang 20.1.0
armv8-a clang 21.1.0
armv8-a clang 9.0.0
armv8-a clang 9.0.1
clad trunk (clang 21.1.0)
clad v1.10 (clang 20.1.0)
clad v1.8 (clang 18.1.0)
clad v1.9 (clang 19.1.0)
clad v2.00 (clang 20.1.0)
clad v2.1 (clang 21.1.0)
clang-cl 18.1.0
ellcc 0.1.33
ellcc 0.1.34
ellcc 2017-07-16
ez80-clang 15.0.0
ez80-clang 15.0.7
hexagon-clang 16.0.5
llvm-mos atari2600-3e
llvm-mos atari2600-4k
llvm-mos atari2600-common
llvm-mos atari5200-supercart
llvm-mos atari8-cart-megacart
llvm-mos atari8-cart-std
llvm-mos atari8-cart-xegs
llvm-mos atari8-common
llvm-mos atari8-dos
llvm-mos c128
llvm-mos c64
llvm-mos commodore
llvm-mos cpm65
llvm-mos cx16
llvm-mos dodo
llvm-mos eater
llvm-mos mega65
llvm-mos nes
llvm-mos nes-action53
llvm-mos nes-cnrom
llvm-mos nes-gtrom
llvm-mos nes-mmc1
llvm-mos nes-mmc3
llvm-mos nes-nrom
llvm-mos nes-unrom
llvm-mos nes-unrom-512
llvm-mos osi-c1p
llvm-mos pce
llvm-mos pce-cd
llvm-mos pce-common
llvm-mos pet
llvm-mos rp6502
llvm-mos rpc8e
llvm-mos supervision
llvm-mos vic20
loongarch64 gcc 12.2.0
loongarch64 gcc 12.3.0
loongarch64 gcc 12.4.0
loongarch64 gcc 12.5.0
loongarch64 gcc 13.1.0
loongarch64 gcc 13.2.0
loongarch64 gcc 13.3.0
loongarch64 gcc 13.4.0
loongarch64 gcc 14.1.0
loongarch64 gcc 14.2.0
loongarch64 gcc 14.3.0
loongarch64 gcc 15.1.0
loongarch64 gcc 15.2.0
mips clang 13.0.0
mips clang 14.0.0
mips clang 15.0.0
mips clang 16.0.0
mips clang 17.0.1
mips clang 18.1.0
mips clang 19.1.0
mips clang 20.1.0
mips clang 21.1.0
mips gcc 11.2.0
mips gcc 12.1.0
mips gcc 12.2.0
mips gcc 12.3.0
mips gcc 12.4.0
mips gcc 12.5.0
mips gcc 13.1.0
mips gcc 13.2.0
mips gcc 13.3.0
mips gcc 13.4.0
mips gcc 14.1.0
mips gcc 14.2.0
mips gcc 14.3.0
mips gcc 15.1.0
mips gcc 15.2.0
mips gcc 4.9.4
mips gcc 5.4
mips gcc 5.5.0
mips gcc 9.3.0 (codescape)
mips gcc 9.5.0
mips64 (el) gcc 12.1.0
mips64 (el) gcc 12.2.0
mips64 (el) gcc 12.3.0
mips64 (el) gcc 12.4.0
mips64 (el) gcc 12.5.0
mips64 (el) gcc 13.1.0
mips64 (el) gcc 13.2.0
mips64 (el) gcc 13.3.0
mips64 (el) gcc 13.4.0
mips64 (el) gcc 14.1.0
mips64 (el) gcc 14.2.0
mips64 (el) gcc 14.3.0
mips64 (el) gcc 15.1.0
mips64 (el) gcc 15.2.0
mips64 (el) gcc 4.9.4
mips64 (el) gcc 5.4.0
mips64 (el) gcc 5.5.0
mips64 (el) gcc 9.5.0
mips64 clang 13.0.0
mips64 clang 14.0.0
mips64 clang 15.0.0
mips64 clang 16.0.0
mips64 clang 17.0.1
mips64 clang 18.1.0
mips64 clang 19.1.0
mips64 clang 20.1.0
mips64 clang 21.1.0
mips64 gcc 11.2.0
mips64 gcc 12.1.0
mips64 gcc 12.2.0
mips64 gcc 12.3.0
mips64 gcc 12.4.0
mips64 gcc 12.5.0
mips64 gcc 13.1.0
mips64 gcc 13.2.0
mips64 gcc 13.3.0
mips64 gcc 13.4.0
mips64 gcc 14.1.0
mips64 gcc 14.2.0
mips64 gcc 14.3.0
mips64 gcc 15.1.0
mips64 gcc 15.2.0
mips64 gcc 4.9.4
mips64 gcc 5.4.0
mips64 gcc 5.5.0
mips64 gcc 9.5.0
mips64el clang 13.0.0
mips64el clang 14.0.0
mips64el clang 15.0.0
mips64el clang 16.0.0
mips64el clang 17.0.1
mips64el clang 18.1.0
mips64el clang 19.1.0
mips64el clang 20.1.0
mips64el clang 21.1.0
mipsel clang 13.0.0
mipsel clang 14.0.0
mipsel clang 15.0.0
mipsel clang 16.0.0
mipsel clang 17.0.1
mipsel clang 18.1.0
mipsel clang 19.1.0
mipsel clang 20.1.0
mipsel clang 21.1.0
mipsel gcc 12.1.0
mipsel gcc 12.2.0
mipsel gcc 12.3.0
mipsel gcc 12.4.0
mipsel gcc 12.5.0
mipsel gcc 13.1.0
mipsel gcc 13.2.0
mipsel gcc 13.3.0
mipsel gcc 13.4.0
mipsel gcc 14.1.0
mipsel gcc 14.2.0
mipsel gcc 14.3.0
mipsel gcc 15.1.0
mipsel gcc 15.2.0
mipsel gcc 4.9.4
mipsel gcc 5.4.0
mipsel gcc 5.5.0
mipsel gcc 9.5.0
nanoMIPS gcc 6.3.0 (mtk)
power gcc 11.2.0
power gcc 12.1.0
power gcc 12.2.0
power gcc 12.3.0
power gcc 12.4.0
power gcc 12.5.0
power gcc 13.1.0
power gcc 13.2.0
power gcc 13.3.0
power gcc 13.4.0
power gcc 14.1.0
power gcc 14.2.0
power gcc 14.3.0
power gcc 15.1.0
power gcc 15.2.0
power gcc 4.8.5
power64 AT12.0 (gcc8)
power64 AT13.0 (gcc9)
power64 gcc 11.2.0
power64 gcc 12.1.0
power64 gcc 12.2.0
power64 gcc 12.3.0
power64 gcc 12.4.0
power64 gcc 12.5.0
power64 gcc 13.1.0
power64 gcc 13.2.0
power64 gcc 13.3.0
power64 gcc 13.4.0
power64 gcc 14.1.0
power64 gcc 14.2.0
power64 gcc 14.3.0
power64 gcc 15.1.0
power64 gcc 15.2.0
power64 gcc trunk
power64le AT12.0 (gcc8)
power64le AT13.0 (gcc9)
power64le clang (trunk)
power64le gcc 11.2.0
power64le gcc 12.1.0
power64le gcc 12.2.0
power64le gcc 12.3.0
power64le gcc 12.4.0
power64le gcc 12.5.0
power64le gcc 13.1.0
power64le gcc 13.2.0
power64le gcc 13.3.0
power64le gcc 13.4.0
power64le gcc 14.1.0
power64le gcc 14.2.0
power64le gcc 14.3.0
power64le gcc 15.1.0
power64le gcc 15.2.0
power64le gcc 6.3.0
power64le gcc trunk
powerpc64 clang (trunk)
qnx 8.0.0
s390x gcc 11.2.0
s390x gcc 12.1.0
s390x gcc 12.2.0
s390x gcc 12.3.0
s390x gcc 12.4.0
s390x gcc 12.5.0
s390x gcc 13.1.0
s390x gcc 13.2.0
s390x gcc 13.3.0
s390x gcc 13.4.0
s390x gcc 14.1.0
s390x gcc 14.2.0
s390x gcc 14.3.0
s390x gcc 15.1.0
s390x gcc 15.2.0
sh gcc 12.2.0
sh gcc 12.3.0
sh gcc 12.4.0
sh gcc 12.5.0
sh gcc 13.1.0
sh gcc 13.2.0
sh gcc 13.3.0
sh gcc 13.4.0
sh gcc 14.1.0
sh gcc 14.2.0
sh gcc 14.3.0
sh gcc 15.1.0
sh gcc 15.2.0
sh gcc 4.9.4
sh gcc 9.5.0
vast (trunk)
x64 msvc v19.0 (ex-WINE)
x64 msvc v19.10 (ex-WINE)
x64 msvc v19.14 (ex-WINE)
x64 msvc v19.20 VS16.0
x64 msvc v19.21 VS16.1
x64 msvc v19.22 VS16.2
x64 msvc v19.23 VS16.3
x64 msvc v19.24 VS16.4
x64 msvc v19.25 VS16.5
x64 msvc v19.27 VS16.7
x64 msvc v19.28 VS16.8
x64 msvc v19.28 VS16.9
x64 msvc v19.29 VS16.10
x64 msvc v19.29 VS16.11
x64 msvc v19.30 VS17.0
x64 msvc v19.31 VS17.1
x64 msvc v19.32 VS17.2
x64 msvc v19.33 VS17.3
x64 msvc v19.34 VS17.4
x64 msvc v19.35 VS17.5
x64 msvc v19.36 VS17.6
x64 msvc v19.37 VS17.7
x64 msvc v19.38 VS17.8
x64 msvc v19.39 VS17.9
x64 msvc v19.40 VS17.10
x64 msvc v19.41 VS17.11
x64 msvc v19.42 VS17.12
x64 msvc v19.43 VS17.13
x64 msvc v19.latest
x86 djgpp 4.9.4
x86 djgpp 5.5.0
x86 djgpp 6.4.0
x86 djgpp 7.2.0
x86 msvc v19.0 (ex-WINE)
x86 msvc v19.10 (ex-WINE)
x86 msvc v19.14 (ex-WINE)
x86 msvc v19.20 VS16.0
x86 msvc v19.21 VS16.1
x86 msvc v19.22 VS16.2
x86 msvc v19.23 VS16.3
x86 msvc v19.24 VS16.4
x86 msvc v19.25 VS16.5
x86 msvc v19.27 VS16.7
x86 msvc v19.28 VS16.8
x86 msvc v19.28 VS16.9
x86 msvc v19.29 VS16.10
x86 msvc v19.29 VS16.11
x86 msvc v19.30 VS17.0
x86 msvc v19.31 VS17.1
x86 msvc v19.32 VS17.2
x86 msvc v19.33 VS17.3
x86 msvc v19.34 VS17.4
x86 msvc v19.35 VS17.5
x86 msvc v19.36 VS17.6
x86 msvc v19.37 VS17.7
x86 msvc v19.38 VS17.8
x86 msvc v19.39 VS17.9
x86 msvc v19.40 VS17.10
x86 msvc v19.41 VS17.11
x86 msvc v19.42 VS17.12
x86 msvc v19.43 VS17.13
x86 msvc v19.latest
x86 nvc++ 22.11
x86 nvc++ 22.7
x86 nvc++ 22.9
x86 nvc++ 23.1
x86 nvc++ 23.11
x86 nvc++ 23.3
x86 nvc++ 23.5
x86 nvc++ 23.7
x86 nvc++ 23.9
x86 nvc++ 24.1
x86 nvc++ 24.11
x86 nvc++ 24.3
x86 nvc++ 24.5
x86 nvc++ 24.7
x86 nvc++ 24.9
x86 nvc++ 25.1
x86 nvc++ 25.3
x86 nvc++ 25.5
x86 nvc++ 25.7
x86 nvc++ 25.9
x86-64 Zapcc 190308
x86-64 clang (-fimplicit-constexpr)
x86-64 clang (Chris Bazley N3089)
x86-64 clang (EricWF contracts)
x86-64 clang (amd-staging)
x86-64 clang (assertions trunk)
x86-64 clang (clangir)
x86-64 clang (experimental -Wlifetime)
x86-64 clang (experimental P1061)
x86-64 clang (experimental P1144)
x86-64 clang (experimental P1221)
x86-64 clang (experimental P2998)
x86-64 clang (experimental P3068)
x86-64 clang (experimental P3309)
x86-64 clang (experimental P3334)
x86-64 clang (experimental P3367)
x86-64 clang (experimental P3372)
x86-64 clang (experimental P3385)
x86-64 clang (experimental P3776)
x86-64 clang (experimental metaprogramming - P2632)
x86-64 clang (old concepts branch)
x86-64 clang (p1974)
x86-64 clang (pattern matching - P2688)
x86-64 clang (reflection - C++26)
x86-64 clang (reflection - TS)
x86-64 clang (resugar)
x86-64 clang (string interpolation - P3412)
x86-64 clang (thephd.dev)
x86-64 clang (trunk)
x86-64 clang (variadic friends - P2893)
x86-64 clang (widberg)
x86-64 clang 10.0.0
x86-64 clang 10.0.0 (assertions)
x86-64 clang 10.0.1
x86-64 clang 11.0.0
x86-64 clang 11.0.0 (assertions)
x86-64 clang 11.0.1
x86-64 clang 12.0.0
x86-64 clang 12.0.0 (assertions)
x86-64 clang 12.0.1
x86-64 clang 13.0.0
x86-64 clang 13.0.0 (assertions)
x86-64 clang 13.0.1
x86-64 clang 14.0.0
x86-64 clang 14.0.0 (assertions)
x86-64 clang 15.0.0
x86-64 clang 15.0.0 (assertions)
x86-64 clang 16.0.0
x86-64 clang 16.0.0 (assertions)
x86-64 clang 17.0.1
x86-64 clang 17.0.1 (assertions)
x86-64 clang 18.1.0
x86-64 clang 18.1.0 (assertions)
x86-64 clang 19.1.0
x86-64 clang 19.1.0 (assertions)
x86-64 clang 2.6.0 (assertions)
x86-64 clang 2.7.0 (assertions)
x86-64 clang 2.8.0 (assertions)
x86-64 clang 2.9.0 (assertions)
x86-64 clang 20.1.0
x86-64 clang 20.1.0 (assertions)
x86-64 clang 21.1.0
x86-64 clang 21.1.0 (assertions)
x86-64 clang 3.0.0
x86-64 clang 3.0.0 (assertions)
x86-64 clang 3.1
x86-64 clang 3.1 (assertions)
x86-64 clang 3.2
x86-64 clang 3.2 (assertions)
x86-64 clang 3.3
x86-64 clang 3.3 (assertions)
x86-64 clang 3.4 (assertions)
x86-64 clang 3.4.1
x86-64 clang 3.5
x86-64 clang 3.5 (assertions)
x86-64 clang 3.5.1
x86-64 clang 3.5.2
x86-64 clang 3.6
x86-64 clang 3.6 (assertions)
x86-64 clang 3.7
x86-64 clang 3.7 (assertions)
x86-64 clang 3.7.1
x86-64 clang 3.8
x86-64 clang 3.8 (assertions)
x86-64 clang 3.8.1
x86-64 clang 3.9.0
x86-64 clang 3.9.0 (assertions)
x86-64 clang 3.9.1
x86-64 clang 4.0.0
x86-64 clang 4.0.0 (assertions)
x86-64 clang 4.0.1
x86-64 clang 5.0.0
x86-64 clang 5.0.0 (assertions)
x86-64 clang 5.0.1
x86-64 clang 5.0.2
x86-64 clang 6.0.0
x86-64 clang 6.0.0 (assertions)
x86-64 clang 6.0.1
x86-64 clang 7.0.0
x86-64 clang 7.0.0 (assertions)
x86-64 clang 7.0.1
x86-64 clang 7.1.0
x86-64 clang 8.0.0
x86-64 clang 8.0.0 (assertions)
x86-64 clang 8.0.1
x86-64 clang 9.0.0
x86-64 clang 9.0.0 (assertions)
x86-64 clang 9.0.1
x86-64 clang rocm-4.5.2
x86-64 clang rocm-5.0.2
x86-64 clang rocm-5.1.3
x86-64 clang rocm-5.2.3
x86-64 clang rocm-5.3.3
x86-64 clang rocm-5.7.0
x86-64 clang rocm-6.0.2
x86-64 clang rocm-6.1.2
x86-64 clang rocm-6.2.4
x86-64 clang rocm-6.3.3
x86-64 clang rocm-6.4.0
x86-64 clang rocm-7.0.1
x86-64 gcc (C++26 reflection)
x86-64 gcc (P2034 lambdas)
x86-64 gcc (contract labels)
x86-64 gcc (contracts natural syntax)
x86-64 gcc (contracts)
x86-64 gcc (coroutines)
x86-64 gcc (modules)
x86-64 gcc (trunk)
x86-64 gcc 10.1
x86-64 gcc 10.2
x86-64 gcc 10.3
x86-64 gcc 10.3 (assertions)
x86-64 gcc 10.4
x86-64 gcc 10.4 (assertions)
x86-64 gcc 10.5
x86-64 gcc 10.5 (assertions)
x86-64 gcc 11.1
x86-64 gcc 11.1 (assertions)
x86-64 gcc 11.2
x86-64 gcc 11.2 (assertions)
x86-64 gcc 11.3
x86-64 gcc 11.3 (assertions)
x86-64 gcc 11.4
x86-64 gcc 11.4 (assertions)
x86-64 gcc 12.1
x86-64 gcc 12.1 (assertions)
x86-64 gcc 12.2
x86-64 gcc 12.2 (assertions)
x86-64 gcc 12.3
x86-64 gcc 12.3 (assertions)
x86-64 gcc 12.4
x86-64 gcc 12.4 (assertions)
x86-64 gcc 12.5
x86-64 gcc 12.5 (assertions)
x86-64 gcc 13.1
x86-64 gcc 13.1 (assertions)
x86-64 gcc 13.2
x86-64 gcc 13.2 (assertions)
x86-64 gcc 13.3
x86-64 gcc 13.3 (assertions)
x86-64 gcc 13.4
x86-64 gcc 13.4 (assertions)
x86-64 gcc 14.1
x86-64 gcc 14.1 (assertions)
x86-64 gcc 14.2
x86-64 gcc 14.2 (assertions)
x86-64 gcc 14.3
x86-64 gcc 14.3 (assertions)
x86-64 gcc 15.1
x86-64 gcc 15.1 (assertions)
x86-64 gcc 15.2
x86-64 gcc 15.2 (assertions)
x86-64 gcc 3.4.6
x86-64 gcc 4.0.4
x86-64 gcc 4.1.2
x86-64 gcc 4.4.7
x86-64 gcc 4.5.3
x86-64 gcc 4.6.4
x86-64 gcc 4.7.1
x86-64 gcc 4.7.2
x86-64 gcc 4.7.3
x86-64 gcc 4.7.4
x86-64 gcc 4.8.1
x86-64 gcc 4.8.2
x86-64 gcc 4.8.3
x86-64 gcc 4.8.4
x86-64 gcc 4.8.5
x86-64 gcc 4.9.0
x86-64 gcc 4.9.1
x86-64 gcc 4.9.2
x86-64 gcc 4.9.3
x86-64 gcc 4.9.4
x86-64 gcc 5.1
x86-64 gcc 5.2
x86-64 gcc 5.3
x86-64 gcc 5.4
x86-64 gcc 5.5
x86-64 gcc 6.1
x86-64 gcc 6.2
x86-64 gcc 6.3
x86-64 gcc 6.4
x86-64 gcc 6.5
x86-64 gcc 7.1
x86-64 gcc 7.2
x86-64 gcc 7.3
x86-64 gcc 7.4
x86-64 gcc 7.5
x86-64 gcc 8.1
x86-64 gcc 8.2
x86-64 gcc 8.3
x86-64 gcc 8.4
x86-64 gcc 8.5
x86-64 gcc 9.1
x86-64 gcc 9.2
x86-64 gcc 9.3
x86-64 gcc 9.4
x86-64 gcc 9.5
x86-64 icc 13.0.1
x86-64 icc 16.0.3
x86-64 icc 17.0.0
x86-64 icc 18.0.0
x86-64 icc 19.0.0
x86-64 icc 19.0.1
x86-64 icc 2021.1.2
x86-64 icc 2021.10.0
x86-64 icc 2021.2.0
x86-64 icc 2021.3.0
x86-64 icc 2021.4.0
x86-64 icc 2021.5.0
x86-64 icc 2021.6.0
x86-64 icc 2021.7.0
x86-64 icc 2021.7.1
x86-64 icc 2021.8.0
x86-64 icc 2021.9.0
x86-64 icx 2021.1.2
x86-64 icx 2021.2.0
x86-64 icx 2021.3.0
x86-64 icx 2021.4.0
x86-64 icx 2022.0.0
x86-64 icx 2022.1.0
x86-64 icx 2022.2.0
x86-64 icx 2022.2.1
x86-64 icx 2023.0.0
x86-64 icx 2023.1.0
x86-64 icx 2023.2.1
x86-64 icx 2024.0.0
x86-64 icx 2024.1.0
x86-64 icx 2024.2.0
x86-64 icx 2024.2.1
x86-64 icx 2025.0.0
x86-64 icx 2025.0.1
x86-64 icx 2025.0.3
x86-64 icx 2025.0.4
x86-64 icx 2025.1.0
x86-64 icx 2025.1.1
x86-64 icx 2025.2.0
x86-64 icx 2025.2.1
x86-64 icx 2025.2.1
z180-clang 15.0.0
z180-clang 15.0.7
z80-clang 15.0.0
z80-clang 15.0.7
zig c++ 0.10.0
zig c++ 0.11.0
zig c++ 0.12.0
zig c++ 0.12.1
zig c++ 0.13.0
zig c++ 0.14.0
zig c++ 0.14.1
zig c++ 0.15.1
zig c++ 0.6.0
zig c++ 0.7.0
zig c++ 0.7.1
zig c++ 0.8.0
zig c++ 0.9.0
zig c++ trunk
Options
Source code
#include <cstdint> #include <type_traits> #include <limits> // SPDX-License-Identifier: MPL-2.0 struct DMAInterface; struct DMASInterface; struct DMASMInterface; #ifndef common_svd2cpp_h #define common_svd2cpp_h #include <cstdint> #include <type_traits> #include <limits> template <typename Treg, typename Tval, unsigned int _Offset, unsigned int _Width> struct BaseField { // Define some useful field attributes using reg_type = typename std::remove_reference_t<Treg>::reg_type; static auto const reg_bits = std::numeric_limits<reg_type>::digits; // Define mask for this field static_assert(_Width > 0, "Width must be non-zero"); static_assert((_Offset + _Width) <= reg_bits, "Offset + Width must not exceed reg_type value size"); static reg_type const constexpr Offset = _Offset; static reg_type const constexpr Width = _Width; static reg_type const constexpr Mask = (((Offset + Width) == reg_bits) ? 0 : (reg_type(1) << (Offset + Width))) - (1U << Offset); // Create accessors for underlying data of this field Treg& reg_; Tval& val_; BaseField(Treg& reg__, Tval& val__) : reg_(reg__), val_(val__) {} protected: // Modify functions are internal, exposed with different signature by either VolatileField or StableField template <typename Targ, class = typename std::enable_if<std::is_integral<Targ>::value>::type> void mod_internal(Targ val_set, typename std::enable_if_t<std::is_integral_v<Targ>>* = 0) { if (__builtin_constant_p(val_set)) { // Constant input, write value to fold to immediate instruction val_ = (val_ & ~Mask) | ((val_set << Offset) & Mask); return; } // Force use BFI instruction #if defined(__ARM_ARCH_ISA_A64) && __ARM_ARCH_ISA_A64 if (reg_bits > 32) { asm ( // More than 32 bits, use X type register "bfi %x[res], %x[set], %[off], %[len]" : [res]"=r" (val_) : "r" (val_), [set] "r" (val_set), [off]"i" (Offset), [len]"i" (Width) ); } else #endif { asm ( #if defined(__ARM_ARCH_ISA_A64) && __ARM_ARCH_ISA_A64 // Use W type register on 64-bit systems "bfi %w[res], %w[set], %[off], %[len]" #else // Use any register on 32-bit systems "bfi %[res], %[set], %[off], %[len]" #endif : [res]"=r" (val_) : "r" (val_), [set] "r" (val_set), [off]"i" (Offset), [len]"i" (Width) ); } } void set_internal() { val_ |= Mask; } void clr_internal() { val_ &= ~Mask; } public: // Read access functions for this field template <typename Tauto> operator Tauto() const { static_assert((not std::is_same_v<Tauto, bool>) || (Width == 1), "Boolean return value is only valid for single bit fields"); static_assert((std::numeric_limits<Tauto>::digits == 0U) // Temporary values are always valid || std::numeric_limits<Tauto>::digits >= Width, "Destination type too small, use an explicit cast to discard additional bits"); return Tauto((val_ & Mask) >> Offset); } auto get() const { if constexpr (Width == 1) { // For auto values of width 1, automatically convert to boolean return static_cast<bool>(this->operator reg_type()); } else { // For other widths, use the register type return this->operator reg_type(); } } }; // Specialization of BaseField with RMW (volatile) access template <typename Treg, unsigned int Offset, unsigned int Width> struct VolatileField : public BaseField<Treg, volatile typename std::remove_reference_t<Treg>::reg_type, Offset, Width> { using Base = BaseField<Treg, volatile typename std::remove_reference_t<Treg>::reg_type, Offset, Width>; VolatileField(Treg& reg__, volatile typename std::remove_reference_t<Treg>::reg_type& val__) : Base(reg__, val__) {} // Expose as RMW, since access is volatile, it implicitly performs a read and write template <typename Targ, class = typename std::enable_if<std::is_integral<Targ>::value>::type> void rmw(Targ val_set, typename std::enable_if_t<std::is_integral_v<Targ>>* = 0) { Base::mod_internal(val_set); } template <typename Targ> void rmw(Targ val_set, typename std::enable_if_t<!std::is_integral_v<Targ> && std::is_enum_v<Targ>>* = 0) { rmw(static_cast<std::underlying_type_t<Targ>>(val_set)); } // Do not return reg_, call chaining is ill-advised void set() { Base::set_internal(); } void clr() { Base::clr_internal(); } }; // Specialization of BaseField with modify-only (non-volatile) access template <typename Treg, unsigned int Offset, unsigned int Width> struct StableField : public BaseField<Treg, typename std::remove_reference_t<Treg>::reg_type, Offset, Width> { using Base = BaseField<Treg, typename std::remove_reference_t<Treg>::reg_type, Offset, Width>; StableField(Treg& reg__, typename std::remove_reference_t<Treg>::reg_type& val__) : Base(reg__, val__) {} // Expose as modify-only, no implicit read or write is performed template <typename Targ> auto& mod(Targ val_set, typename std::enable_if_t<std::is_integral_v<Targ>>* = 0) { Base::mod_internal(val_set); return Base::reg_; } template <typename Targ> auto& mod(Targ val_set, typename std::enable_if_t<!std::is_integral_v<Targ> && std::is_enum_v<Targ>>* = 0) { return mod(static_cast<std::underlying_type_t<Targ>>(val_set)); } // Stable call chaining is desired, return reg_ auto& set() { Base::set_internal(); return Base::reg_; } auto& clr() { Base::clr_internal(); return Base::reg_; } }; // Specialization of BaseField with const access template <typename Treg, unsigned int Offset, unsigned int Width> struct ConstField : public BaseField<Treg, typename std::remove_reference_t<Treg>::reg_type const, Offset, Width> { using Base = BaseField<Treg, typename std::remove_reference_t<Treg>::reg_type const, Offset, Width>; ConstField(Treg& reg__, typename std::remove_reference_t<Treg>::reg_type const& val__) : Base(reg__, val__) {} // const, so no modify functions accessible }; template <typename Tval, Tval reset_value, typename Reg> struct Register { using reg_type = Tval; static auto const reg_bits = std::numeric_limits<reg_type>::digits; volatile Tval val_vol; auto read() { return typename Reg::StableAccess{ val_vol, val_vol }; } auto init(Tval val_init = reset_value) { return typename Reg::StableAccess{ val_vol, val_init }; } void write(Tval val_write) { val_vol = val_write; } void clear() { val_vol = 0; } void set(reg_type mask) { val_vol |= mask; } void clr(reg_type mask) { val_vol &= ~mask; } template <typename Targ, class = typename std::enable_if<std::is_integral<Targ>::value>::type> void rmw(reg_type offset, reg_type mask, Targ val_set, typename std::enable_if_t<std::is_integral_v<Targ>>* = 0) { rmw_internal(offset, mask, val_set); } template <typename Targ> void rmw(reg_type offset, reg_type mask, Targ val_set, typename std::enable_if_t<!std::is_integral_v<Targ> && std::is_enum_v<Targ>>* = 0) { rmw(offset, mask, static_cast<std::underlying_type_t<Targ>>(val_set)); } protected: void rmw_internal(reg_type offset, reg_type mask, reg_type val_set) { // Width and offset are not constant, unable to use BFI here val_vol = (val_vol & ~mask) | ((val_set << offset) & mask); } private: // Delete unwanted operators Register(Register const&) = delete; Register& operator=(Register const&) = delete; }; template <typename Tval> struct StableAccessBase { using reg_type = Tval; volatile Tval& val_vol; Tval val_copy; StableAccessBase(volatile Tval& val_vol__, Tval val_copy__) : val_vol(val_vol__), val_copy(val_copy__) {} operator Tval() const { return val_copy; } void write() { val_vol = val_copy; } void clear() { val_copy = 0; } void set(reg_type mask) { val_copy |= mask; } void clr(reg_type mask) { val_copy &= ~mask; } template <typename Targ, class = typename std::enable_if<std::is_integral<Targ>::value>::type> auto& mod(reg_type offset, reg_type mask, Targ val_set, typename std::enable_if_t<std::is_integral_v<Targ>>* = 0) { return mod_internal(offset, mask, val_set); } template <typename Targ> auto& mod(reg_type offset, reg_type mask, Targ val_set, typename std::enable_if_t<!std::is_integral_v<Targ> && std::is_enum_v<Targ>>* = 0) { return mod(offset, mask, static_cast<std::underlying_type_t<Targ>>(val_set)); } protected: auto& mod_internal(reg_type offset, reg_type mask, reg_type val_set) { // Width and offset are not constant, unable to use BFI here val_vol = (val_vol & ~mask) | ((val_set << offset) & mask); return *this; } private: // Delete unwanted operators StableAccessBase(StableAccessBase const&) = delete; StableAccessBase& operator=(StableAccessBase const&) = delete; }; #endif // common_svd2cpp_h // Cluster DMA.S[%s].M[%s] generated by svd2cpp, array index by ['0', '1'] struct DMASMInterface { // stream x memory [0|1] address register struct ARReg : public Register<std::uint32_t, 0x00000000, ARReg> { using M0AField = VolatileField<ARReg, 0, 32>; // Memory 0 address auto M0A() { return M0AField{ *this, val_vol }; } struct StableAccess : public StableAccessBase<reg_type> { StableAccess(volatile reg_type& val_vol__, reg_type val_copy__) : StableAccessBase<reg_type>(val_vol__, val_copy__) {} auto M0A() { return StableField<decltype(*this), 0, 32>{ *this, val_copy }; } auto M0A() const { return ConstField<decltype(*this), 0, 32>{ *this, val_copy }; } // Memory 0 address template <typename Targ> auto& M0A(Targ val) { return M0A().mod(val); } }; } AR; enum Index { _0, _1, }; }; // Cluster DMA.S[%s] generated by svd2cpp, array index by ['0', '1', '2', '3', '4', '5', '6', '7'] struct DMASInterface { // stream x configuration register struct CRReg : public Register<std::uint32_t, 0x00000000, CRReg> { using ENField = VolatileField<CRReg, 0, 1>; // Stream enable / flag stream ready when read low auto EN() { return ENField{ *this, val_vol }; } using DMEIEField = VolatileField<CRReg, 1, 1>; // Direct mode error interrupt enable auto DMEIE() { return DMEIEField{ *this, val_vol }; } using TEIEField = VolatileField<CRReg, 2, 1>; // Transfer error interrupt enable auto TEIE() { return TEIEField{ *this, val_vol }; } using HTIEField = VolatileField<CRReg, 3, 1>; // Half transfer interrupt enable auto HTIE() { return HTIEField{ *this, val_vol }; } using TCIEField = VolatileField<CRReg, 4, 1>; // Transfer complete interrupt enable auto TCIE() { return TCIEField{ *this, val_vol }; } using PFCTRLField = VolatileField<CRReg, 5, 1>; // Peripheral flow controller auto PFCTRL() { return PFCTRLField{ *this, val_vol }; } using DIRField = VolatileField<CRReg, 6, 2>; // Data transfer direction auto DIR() { return DIRField{ *this, val_vol }; } using CIRCField = VolatileField<CRReg, 8, 1>; // Circular mode auto CIRC() { return CIRCField{ *this, val_vol }; } using PINCField = VolatileField<CRReg, 9, 1>; // Peripheral increment mode auto PINC() { return PINCField{ *this, val_vol }; } using MINCField = VolatileField<CRReg, 10, 1>; // Memory increment mode auto MINC() { return MINCField{ *this, val_vol }; } using PSIZEField = VolatileField<CRReg, 11, 2>; // Peripheral data size auto PSIZE() { return PSIZEField{ *this, val_vol }; } using MSIZEField = VolatileField<CRReg, 13, 2>; // Memory data size auto MSIZE() { return MSIZEField{ *this, val_vol }; } using PINCOSField = VolatileField<CRReg, 15, 1>; // Peripheral increment offset size auto PINCOS() { return PINCOSField{ *this, val_vol }; } using PLField = VolatileField<CRReg, 16, 2>; // Priority level auto PL() { return PLField{ *this, val_vol }; } using DBMField = VolatileField<CRReg, 18, 1>; // Double buffer mode auto DBM() { return DBMField{ *this, val_vol }; } using CTField = VolatileField<CRReg, 19, 1>; // Current target (only in double buffer mode) auto CT() { return CTField{ *this, val_vol }; } using ACKField = VolatileField<CRReg, 20, 1>; // ACK auto ACK() { return ACKField{ *this, val_vol }; } using PBURSTField = VolatileField<CRReg, 21, 2>; // Peripheral burst transfer configuration auto PBURST() { return PBURSTField{ *this, val_vol }; } using MBURSTField = VolatileField<CRReg, 23, 2>; // Memory burst transfer configuration auto MBURST() { return MBURSTField{ *this, val_vol }; } struct StableAccess : public StableAccessBase<reg_type> { StableAccess(volatile reg_type& val_vol__, reg_type val_copy__) : StableAccessBase<reg_type>(val_vol__, val_copy__) {} auto EN() { return StableField<decltype(*this), 0, 1>{ *this, val_copy }; } auto EN() const { return ConstField<decltype(*this), 0, 1>{ *this, val_copy }; } // Stream enable / flag stream ready when read low template <typename Targ> auto& EN(Targ val) { return EN().mod(val); } auto DMEIE() { return StableField<decltype(*this), 1, 1>{ *this, val_copy }; } auto DMEIE() const { return ConstField<decltype(*this), 1, 1>{ *this, val_copy }; } // Direct mode error interrupt enable template <typename Targ> auto& DMEIE(Targ val) { return DMEIE().mod(val); } auto TEIE() { return StableField<decltype(*this), 2, 1>{ *this, val_copy }; } auto TEIE() const { return ConstField<decltype(*this), 2, 1>{ *this, val_copy }; } // Transfer error interrupt enable template <typename Targ> auto& TEIE(Targ val) { return TEIE().mod(val); } auto HTIE() { return StableField<decltype(*this), 3, 1>{ *this, val_copy }; } auto HTIE() const { return ConstField<decltype(*this), 3, 1>{ *this, val_copy }; } // Half transfer interrupt enable template <typename Targ> auto& HTIE(Targ val) { return HTIE().mod(val); } auto TCIE() { return StableField<decltype(*this), 4, 1>{ *this, val_copy }; } auto TCIE() const { return ConstField<decltype(*this), 4, 1>{ *this, val_copy }; } // Transfer complete interrupt enable template <typename Targ> auto& TCIE(Targ val) { return TCIE().mod(val); } auto PFCTRL() { return StableField<decltype(*this), 5, 1>{ *this, val_copy }; } auto PFCTRL() const { return ConstField<decltype(*this), 5, 1>{ *this, val_copy }; } // Peripheral flow controller template <typename Targ> auto& PFCTRL(Targ val) { return PFCTRL().mod(val); } auto DIR() { return StableField<decltype(*this), 6, 2>{ *this, val_copy }; } auto DIR() const { return ConstField<decltype(*this), 6, 2>{ *this, val_copy }; } // Data transfer direction template <typename Targ> auto& DIR(Targ val) { return DIR().mod(val); } auto CIRC() { return StableField<decltype(*this), 8, 1>{ *this, val_copy }; } auto CIRC() const { return ConstField<decltype(*this), 8, 1>{ *this, val_copy }; } // Circular mode template <typename Targ> auto& CIRC(Targ val) { return CIRC().mod(val); } auto PINC() { return StableField<decltype(*this), 9, 1>{ *this, val_copy }; } auto PINC() const { return ConstField<decltype(*this), 9, 1>{ *this, val_copy }; } // Peripheral increment mode template <typename Targ> auto& PINC(Targ val) { return PINC().mod(val); } auto MINC() { return StableField<decltype(*this), 10, 1>{ *this, val_copy }; } auto MINC() const { return ConstField<decltype(*this), 10, 1>{ *this, val_copy }; } // Memory increment mode template <typename Targ> auto& MINC(Targ val) { return MINC().mod(val); } auto PSIZE() { return StableField<decltype(*this), 11, 2>{ *this, val_copy }; } auto PSIZE() const { return ConstField<decltype(*this), 11, 2>{ *this, val_copy }; } // Peripheral data size template <typename Targ> auto& PSIZE(Targ val) { return PSIZE().mod(val); } auto MSIZE() { return StableField<decltype(*this), 13, 2>{ *this, val_copy }; } auto MSIZE() const { return ConstField<decltype(*this), 13, 2>{ *this, val_copy }; } // Memory data size template <typename Targ> auto& MSIZE(Targ val) { return MSIZE().mod(val); } auto PINCOS() { return StableField<decltype(*this), 15, 1>{ *this, val_copy }; } auto PINCOS() const { return ConstField<decltype(*this), 15, 1>{ *this, val_copy }; } // Peripheral increment offset size template <typename Targ> auto& PINCOS(Targ val) { return PINCOS().mod(val); } auto PL() { return StableField<decltype(*this), 16, 2>{ *this, val_copy }; } auto PL() const { return ConstField<decltype(*this), 16, 2>{ *this, val_copy }; } // Priority level template <typename Targ> auto& PL(Targ val) { return PL().mod(val); } auto DBM() { return StableField<decltype(*this), 18, 1>{ *this, val_copy }; } auto DBM() const { return ConstField<decltype(*this), 18, 1>{ *this, val_copy }; } // Double buffer mode template <typename Targ> auto& DBM(Targ val) { return DBM().mod(val); } auto CT() { return StableField<decltype(*this), 19, 1>{ *this, val_copy }; } auto CT() const { return ConstField<decltype(*this), 19, 1>{ *this, val_copy }; } // Current target (only in double buffer mode) template <typename Targ> auto& CT(Targ val) { return CT().mod(val); } auto ACK() { return StableField<decltype(*this), 20, 1>{ *this, val_copy }; } auto ACK() const { return ConstField<decltype(*this), 20, 1>{ *this, val_copy }; } // ACK template <typename Targ> auto& ACK(Targ val) { return ACK().mod(val); } auto PBURST() { return StableField<decltype(*this), 21, 2>{ *this, val_copy }; } auto PBURST() const { return ConstField<decltype(*this), 21, 2>{ *this, val_copy }; } // Peripheral burst transfer configuration template <typename Targ> auto& PBURST(Targ val) { return PBURST().mod(val); } auto MBURST() { return StableField<decltype(*this), 23, 2>{ *this, val_copy }; } auto MBURST() const { return ConstField<decltype(*this), 23, 2>{ *this, val_copy }; } // Memory burst transfer configuration template <typename Targ> auto& MBURST(Targ val) { return MBURST().mod(val); } }; } CR; // stream x number of data register struct NDTRReg : public Register<std::uint32_t, 0x00000000, NDTRReg> { using NDTField = VolatileField<NDTRReg, 0, 16>; // Number of data items to transfer auto NDT() { return NDTField{ *this, val_vol }; } struct StableAccess : public StableAccessBase<reg_type> { StableAccess(volatile reg_type& val_vol__, reg_type val_copy__) : StableAccessBase<reg_type>(val_vol__, val_copy__) {} auto NDT() { return StableField<decltype(*this), 0, 16>{ *this, val_copy }; } auto NDT() const { return ConstField<decltype(*this), 0, 16>{ *this, val_copy }; } // Number of data items to transfer template <typename Targ> auto& NDT(Targ val) { return NDT().mod(val); } }; } NDTR; // stream x peripheral address register struct PARReg : public Register<std::uint32_t, 0x00000000, PARReg> { using PAField = VolatileField<PARReg, 0, 32>; // Peripheral address auto PA() { return PAField{ *this, val_vol }; } struct StableAccess : public StableAccessBase<reg_type> { StableAccess(volatile reg_type& val_vol__, reg_type val_copy__) : StableAccessBase<reg_type>(val_vol__, val_copy__) {} auto PA() { return StableField<decltype(*this), 0, 32>{ *this, val_copy }; } auto PA() const { return ConstField<decltype(*this), 0, 32>{ *this, val_copy }; } // Peripheral address template <typename Targ> auto& PA(Targ val) { return PA().mod(val); } }; } PAR; // Cluster DMA.S[%s].M[%s] generated by svd2cpp, array index by ['0', '1'] DMASMInterface M[2]; // stream x FIFO control register struct FCRReg : public Register<std::uint32_t, 0x00000021, FCRReg> { using FTHField = VolatileField<FCRReg, 0, 2>; // FIFO threshold selection auto FTH() { return FTHField{ *this, val_vol }; } using DMDISField = VolatileField<FCRReg, 2, 1>; // Direct mode disable auto DMDIS() { return DMDISField{ *this, val_vol }; } using FSField = VolatileField<FCRReg, 3, 3>; // FIFO status auto FS() { return FSField{ *this, val_vol }; } using FEIEField = VolatileField<FCRReg, 7, 1>; // FIFO error interrupt enable auto FEIE() { return FEIEField{ *this, val_vol }; } struct StableAccess : public StableAccessBase<reg_type> { StableAccess(volatile reg_type& val_vol__, reg_type val_copy__) : StableAccessBase<reg_type>(val_vol__, val_copy__) {} auto FTH() { return StableField<decltype(*this), 0, 2>{ *this, val_copy }; } auto FTH() const { return ConstField<decltype(*this), 0, 2>{ *this, val_copy }; } // FIFO threshold selection template <typename Targ> auto& FTH(Targ val) { return FTH().mod(val); } auto DMDIS() { return StableField<decltype(*this), 2, 1>{ *this, val_copy }; } auto DMDIS() const { return ConstField<decltype(*this), 2, 1>{ *this, val_copy }; } // Direct mode disable template <typename Targ> auto& DMDIS(Targ val) { return DMDIS().mod(val); } auto FS() { return StableField<decltype(*this), 3, 3>{ *this, val_copy }; } auto FS() const { return ConstField<decltype(*this), 3, 3>{ *this, val_copy }; } // FIFO status template <typename Targ> auto& FS(Targ val) { return FS().mod(val); } auto FEIE() { return StableField<decltype(*this), 7, 1>{ *this, val_copy }; } auto FEIE() const { return ConstField<decltype(*this), 7, 1>{ *this, val_copy }; } // FIFO error interrupt enable template <typename Targ> auto& FEIE(Targ val) { return FEIE().mod(val); } }; } FCR; enum Index { _0, _1, _2, _3, _4, _5, _6, _7, }; }; // DMA controller struct DMAInterface { // low interrupt status register struct LISRReg : public Register<std::uint32_t, 0x00000000, LISRReg> { using FEIF0Field = VolatileField<LISRReg, 0, 1>; // Stream x FIFO error interrupt flag (x=3..0) auto FEIF0() { return FEIF0Field{ *this, val_vol }; } using DMEIF0Field = VolatileField<LISRReg, 2, 1>; // Stream x direct mode error interrupt flag (x=3..0) auto DMEIF0() { return DMEIF0Field{ *this, val_vol }; } using TEIF0Field = VolatileField<LISRReg, 3, 1>; // Stream x transfer error interrupt flag (x=3..0) auto TEIF0() { return TEIF0Field{ *this, val_vol }; } using HTIF0Field = VolatileField<LISRReg, 4, 1>; // Stream x half transfer interrupt flag (x=3..0) auto HTIF0() { return HTIF0Field{ *this, val_vol }; } using TCIF0Field = VolatileField<LISRReg, 5, 1>; // Stream x transfer complete interrupt flag (x = 3..0) auto TCIF0() { return TCIF0Field{ *this, val_vol }; } using FEIF1Field = VolatileField<LISRReg, 6, 1>; // Stream x FIFO error interrupt flag (x=3..0) auto FEIF1() { return FEIF1Field{ *this, val_vol }; } using DMEIF1Field = VolatileField<LISRReg, 8, 1>; // Stream x direct mode error interrupt flag (x=3..0) auto DMEIF1() { return DMEIF1Field{ *this, val_vol }; } using TEIF1Field = VolatileField<LISRReg, 9, 1>; // Stream x transfer error interrupt flag (x=3..0) auto TEIF1() { return TEIF1Field{ *this, val_vol }; } using HTIF1Field = VolatileField<LISRReg, 10, 1>; // Stream x half transfer interrupt flag (x=3..0) auto HTIF1() { return HTIF1Field{ *this, val_vol }; } using TCIF1Field = VolatileField<LISRReg, 11, 1>; // Stream x transfer complete interrupt flag (x = 3..0) auto TCIF1() { return TCIF1Field{ *this, val_vol }; } using FEIF2Field = VolatileField<LISRReg, 16, 1>; // Stream x FIFO error interrupt flag (x=3..0) auto FEIF2() { return FEIF2Field{ *this, val_vol }; } using DMEIF2Field = VolatileField<LISRReg, 18, 1>; // Stream x direct mode error interrupt flag (x=3..0) auto DMEIF2() { return DMEIF2Field{ *this, val_vol }; } using TEIF2Field = VolatileField<LISRReg, 19, 1>; // Stream x transfer error interrupt flag (x=3..0) auto TEIF2() { return TEIF2Field{ *this, val_vol }; } using HTIF2Field = VolatileField<LISRReg, 20, 1>; // Stream x half transfer interrupt flag (x=3..0) auto HTIF2() { return HTIF2Field{ *this, val_vol }; } using TCIF2Field = VolatileField<LISRReg, 21, 1>; // Stream x transfer complete interrupt flag (x = 3..0) auto TCIF2() { return TCIF2Field{ *this, val_vol }; } using FEIF3Field = VolatileField<LISRReg, 22, 1>; // Stream x FIFO error interrupt flag (x=3..0) auto FEIF3() { return FEIF3Field{ *this, val_vol }; } using DMEIF3Field = VolatileField<LISRReg, 24, 1>; // Stream x direct mode error interrupt flag (x=3..0) auto DMEIF3() { return DMEIF3Field{ *this, val_vol }; } using TEIF3Field = VolatileField<LISRReg, 25, 1>; // Stream x transfer error interrupt flag (x=3..0) auto TEIF3() { return TEIF3Field{ *this, val_vol }; } using HTIF3Field = VolatileField<LISRReg, 26, 1>; // Stream x half transfer interrupt flag (x=3..0) auto HTIF3() { return HTIF3Field{ *this, val_vol }; } using TCIF3Field = VolatileField<LISRReg, 27, 1>; // Stream x transfer complete interrupt flag (x = 3..0) auto TCIF3() { return TCIF3Field{ *this, val_vol }; } struct StableAccess : public StableAccessBase<reg_type> { StableAccess(volatile reg_type& val_vol__, reg_type val_copy__) : StableAccessBase<reg_type>(val_vol__, val_copy__) {} auto FEIF0() { return StableField<decltype(*this), 0, 1>{ *this, val_copy }; } auto FEIF0() const { return ConstField<decltype(*this), 0, 1>{ *this, val_copy }; } // Stream x FIFO error interrupt flag (x=3..0) template <typename Targ> auto& FEIF0(Targ val) { return FEIF0().mod(val); } auto DMEIF0() { return StableField<decltype(*this), 2, 1>{ *this, val_copy }; } auto DMEIF0() const { return ConstField<decltype(*this), 2, 1>{ *this, val_copy }; } // Stream x direct mode error interrupt flag (x=3..0) template <typename Targ> auto& DMEIF0(Targ val) { return DMEIF0().mod(val); } auto TEIF0() { return StableField<decltype(*this), 3, 1>{ *this, val_copy }; } auto TEIF0() const { return ConstField<decltype(*this), 3, 1>{ *this, val_copy }; } // Stream x transfer error interrupt flag (x=3..0) template <typename Targ> auto& TEIF0(Targ val) { return TEIF0().mod(val); } auto HTIF0() { return StableField<decltype(*this), 4, 1>{ *this, val_copy }; } auto HTIF0() const { return ConstField<decltype(*this), 4, 1>{ *this, val_copy }; } // Stream x half transfer interrupt flag (x=3..0) template <typename Targ> auto& HTIF0(Targ val) { return HTIF0().mod(val); } auto TCIF0() { return StableField<decltype(*this), 5, 1>{ *this, val_copy }; } auto TCIF0() const { return ConstField<decltype(*this), 5, 1>{ *this, val_copy }; } // Stream x transfer complete interrupt flag (x = 3..0) template <typename Targ> auto& TCIF0(Targ val) { return TCIF0().mod(val); } auto FEIF1() { return StableField<decltype(*this), 6, 1>{ *this, val_copy }; } auto FEIF1() const { return ConstField<decltype(*this), 6, 1>{ *this, val_copy }; } // Stream x FIFO error interrupt flag (x=3..0) template <typename Targ> auto& FEIF1(Targ val) { return FEIF1().mod(val); } auto DMEIF1() { return StableField<decltype(*this), 8, 1>{ *this, val_copy }; } auto DMEIF1() const { return ConstField<decltype(*this), 8, 1>{ *this, val_copy }; } // Stream x direct mode error interrupt flag (x=3..0) template <typename Targ> auto& DMEIF1(Targ val) { return DMEIF1().mod(val); } auto TEIF1() { return StableField<decltype(*this), 9, 1>{ *this, val_copy }; } auto TEIF1() const { return ConstField<decltype(*this), 9, 1>{ *this, val_copy }; } // Stream x transfer error interrupt flag (x=3..0) template <typename Targ> auto& TEIF1(Targ val) { return TEIF1().mod(val); } auto HTIF1() { return StableField<decltype(*this), 10, 1>{ *this, val_copy }; } auto HTIF1() const { return ConstField<decltype(*this), 10, 1>{ *this, val_copy }; } // Stream x half transfer interrupt flag (x=3..0) template <typename Targ> auto& HTIF1(Targ val) { return HTIF1().mod(val); } auto TCIF1() { return StableField<decltype(*this), 11, 1>{ *this, val_copy }; } auto TCIF1() const { return ConstField<decltype(*this), 11, 1>{ *this, val_copy }; } // Stream x transfer complete interrupt flag (x = 3..0) template <typename Targ> auto& TCIF1(Targ val) { return TCIF1().mod(val); } auto FEIF2() { return StableField<decltype(*this), 16, 1>{ *this, val_copy }; } auto FEIF2() const { return ConstField<decltype(*this), 16, 1>{ *this, val_copy }; } // Stream x FIFO error interrupt flag (x=3..0) template <typename Targ> auto& FEIF2(Targ val) { return FEIF2().mod(val); } auto DMEIF2() { return StableField<decltype(*this), 18, 1>{ *this, val_copy }; } auto DMEIF2() const { return ConstField<decltype(*this), 18, 1>{ *this, val_copy }; } // Stream x direct mode error interrupt flag (x=3..0) template <typename Targ> auto& DMEIF2(Targ val) { return DMEIF2().mod(val); } auto TEIF2() { return StableField<decltype(*this), 19, 1>{ *this, val_copy }; } auto TEIF2() const { return ConstField<decltype(*this), 19, 1>{ *this, val_copy }; } // Stream x transfer error interrupt flag (x=3..0) template <typename Targ> auto& TEIF2(Targ val) { return TEIF2().mod(val); } auto HTIF2() { return StableField<decltype(*this), 20, 1>{ *this, val_copy }; } auto HTIF2() const { return ConstField<decltype(*this), 20, 1>{ *this, val_copy }; } // Stream x half transfer interrupt flag (x=3..0) template <typename Targ> auto& HTIF2(Targ val) { return HTIF2().mod(val); } auto TCIF2() { return StableField<decltype(*this), 21, 1>{ *this, val_copy }; } auto TCIF2() const { return ConstField<decltype(*this), 21, 1>{ *this, val_copy }; } // Stream x transfer complete interrupt flag (x = 3..0) template <typename Targ> auto& TCIF2(Targ val) { return TCIF2().mod(val); } auto FEIF3() { return StableField<decltype(*this), 22, 1>{ *this, val_copy }; } auto FEIF3() const { return ConstField<decltype(*this), 22, 1>{ *this, val_copy }; } // Stream x FIFO error interrupt flag (x=3..0) template <typename Targ> auto& FEIF3(Targ val) { return FEIF3().mod(val); } auto DMEIF3() { return StableField<decltype(*this), 24, 1>{ *this, val_copy }; } auto DMEIF3() const { return ConstField<decltype(*this), 24, 1>{ *this, val_copy }; } // Stream x direct mode error interrupt flag (x=3..0) template <typename Targ> auto& DMEIF3(Targ val) { return DMEIF3().mod(val); } auto TEIF3() { return StableField<decltype(*this), 25, 1>{ *this, val_copy }; } auto TEIF3() const { return ConstField<decltype(*this), 25, 1>{ *this, val_copy }; } // Stream x transfer error interrupt flag (x=3..0) template <typename Targ> auto& TEIF3(Targ val) { return TEIF3().mod(val); } auto HTIF3() { return StableField<decltype(*this), 26, 1>{ *this, val_copy }; } auto HTIF3() const { return ConstField<decltype(*this), 26, 1>{ *this, val_copy }; } // Stream x half transfer interrupt flag (x=3..0) template <typename Targ> auto& HTIF3(Targ val) { return HTIF3().mod(val); } auto TCIF3() { return StableField<decltype(*this), 27, 1>{ *this, val_copy }; } auto TCIF3() const { return ConstField<decltype(*this), 27, 1>{ *this, val_copy }; } // Stream x transfer complete interrupt flag (x = 3..0) template <typename Targ> auto& TCIF3(Targ val) { return TCIF3().mod(val); } }; } LISR; // high interrupt status register struct HISRReg : public Register<std::uint32_t, 0x00000000, HISRReg> { using FEIF4Field = VolatileField<HISRReg, 0, 1>; // Stream x FIFO error interrupt flag (x=7..4) auto FEIF4() { return FEIF4Field{ *this, val_vol }; } using DMEIF4Field = VolatileField<HISRReg, 2, 1>; // Stream x direct mode error interrupt flag (x=7..4) auto DMEIF4() { return DMEIF4Field{ *this, val_vol }; } using TEIF4Field = VolatileField<HISRReg, 3, 1>; // Stream x transfer error interrupt flag (x=7..4) auto TEIF4() { return TEIF4Field{ *this, val_vol }; } using HTIF4Field = VolatileField<HISRReg, 4, 1>; // Stream x half transfer interrupt flag (x=7..4) auto HTIF4() { return HTIF4Field{ *this, val_vol }; } using TCIF4Field = VolatileField<HISRReg, 5, 1>; // Stream x transfer complete interrupt flag (x=7..4) auto TCIF4() { return TCIF4Field{ *this, val_vol }; } using FEIF5Field = VolatileField<HISRReg, 6, 1>; // Stream x FIFO error interrupt flag (x=7..4) auto FEIF5() { return FEIF5Field{ *this, val_vol }; } using DMEIF5Field = VolatileField<HISRReg, 8, 1>; // Stream x direct mode error interrupt flag (x=7..4) auto DMEIF5() { return DMEIF5Field{ *this, val_vol }; } using TEIF5Field = VolatileField<HISRReg, 9, 1>; // Stream x transfer error interrupt flag (x=7..4) auto TEIF5() { return TEIF5Field{ *this, val_vol }; } using HTIF5Field = VolatileField<HISRReg, 10, 1>; // Stream x half transfer interrupt flag (x=7..4) auto HTIF5() { return HTIF5Field{ *this, val_vol }; } using TCIF5Field = VolatileField<HISRReg, 11, 1>; // Stream x transfer complete interrupt flag (x=7..4) auto TCIF5() { return TCIF5Field{ *this, val_vol }; } using FEIF6Field = VolatileField<HISRReg, 16, 1>; // Stream x FIFO error interrupt flag (x=7..4) auto FEIF6() { return FEIF6Field{ *this, val_vol }; } using DMEIF6Field = VolatileField<HISRReg, 18, 1>; // Stream x direct mode error interrupt flag (x=7..4) auto DMEIF6() { return DMEIF6Field{ *this, val_vol }; } using TEIF6Field = VolatileField<HISRReg, 19, 1>; // Stream x transfer error interrupt flag (x=7..4) auto TEIF6() { return TEIF6Field{ *this, val_vol }; } using HTIF6Field = VolatileField<HISRReg, 20, 1>; // Stream x half transfer interrupt flag (x=7..4) auto HTIF6() { return HTIF6Field{ *this, val_vol }; } using TCIF6Field = VolatileField<HISRReg, 21, 1>; // Stream x transfer complete interrupt flag (x=7..4) auto TCIF6() { return TCIF6Field{ *this, val_vol }; } using FEIF7Field = VolatileField<HISRReg, 22, 1>; // Stream x FIFO error interrupt flag (x=7..4) auto FEIF7() { return FEIF7Field{ *this, val_vol }; } using DMEIF7Field = VolatileField<HISRReg, 24, 1>; // Stream x direct mode error interrupt flag (x=7..4) auto DMEIF7() { return DMEIF7Field{ *this, val_vol }; } using TEIF7Field = VolatileField<HISRReg, 25, 1>; // Stream x transfer error interrupt flag (x=7..4) auto TEIF7() { return TEIF7Field{ *this, val_vol }; } using HTIF7Field = VolatileField<HISRReg, 26, 1>; // Stream x half transfer interrupt flag (x=7..4) auto HTIF7() { return HTIF7Field{ *this, val_vol }; } using TCIF7Field = VolatileField<HISRReg, 27, 1>; // Stream x transfer complete interrupt flag (x=7..4) auto TCIF7() { return TCIF7Field{ *this, val_vol }; } struct StableAccess : public StableAccessBase<reg_type> { StableAccess(volatile reg_type& val_vol__, reg_type val_copy__) : StableAccessBase<reg_type>(val_vol__, val_copy__) {} auto FEIF4() { return StableField<decltype(*this), 0, 1>{ *this, val_copy }; } auto FEIF4() const { return ConstField<decltype(*this), 0, 1>{ *this, val_copy }; } // Stream x FIFO error interrupt flag (x=7..4) template <typename Targ> auto& FEIF4(Targ val) { return FEIF4().mod(val); } auto DMEIF4() { return StableField<decltype(*this), 2, 1>{ *this, val_copy }; } auto DMEIF4() const { return ConstField<decltype(*this), 2, 1>{ *this, val_copy }; } // Stream x direct mode error interrupt flag (x=7..4) template <typename Targ> auto& DMEIF4(Targ val) { return DMEIF4().mod(val); } auto TEIF4() { return StableField<decltype(*this), 3, 1>{ *this, val_copy }; } auto TEIF4() const { return ConstField<decltype(*this), 3, 1>{ *this, val_copy }; } // Stream x transfer error interrupt flag (x=7..4) template <typename Targ> auto& TEIF4(Targ val) { return TEIF4().mod(val); } auto HTIF4() { return StableField<decltype(*this), 4, 1>{ *this, val_copy }; } auto HTIF4() const { return ConstField<decltype(*this), 4, 1>{ *this, val_copy }; } // Stream x half transfer interrupt flag (x=7..4) template <typename Targ> auto& HTIF4(Targ val) { return HTIF4().mod(val); } auto TCIF4() { return StableField<decltype(*this), 5, 1>{ *this, val_copy }; } auto TCIF4() const { return ConstField<decltype(*this), 5, 1>{ *this, val_copy }; } // Stream x transfer complete interrupt flag (x=7..4) template <typename Targ> auto& TCIF4(Targ val) { return TCIF4().mod(val); } auto FEIF5() { return StableField<decltype(*this), 6, 1>{ *this, val_copy }; } auto FEIF5() const { return ConstField<decltype(*this), 6, 1>{ *this, val_copy }; } // Stream x FIFO error interrupt flag (x=7..4) template <typename Targ> auto& FEIF5(Targ val) { return FEIF5().mod(val); } auto DMEIF5() { return StableField<decltype(*this), 8, 1>{ *this, val_copy }; } auto DMEIF5() const { return ConstField<decltype(*this), 8, 1>{ *this, val_copy }; } // Stream x direct mode error interrupt flag (x=7..4) template <typename Targ> auto& DMEIF5(Targ val) { return DMEIF5().mod(val); } auto TEIF5() { return StableField<decltype(*this), 9, 1>{ *this, val_copy }; } auto TEIF5() const { return ConstField<decltype(*this), 9, 1>{ *this, val_copy }; } // Stream x transfer error interrupt flag (x=7..4) template <typename Targ> auto& TEIF5(Targ val) { return TEIF5().mod(val); } auto HTIF5() { return StableField<decltype(*this), 10, 1>{ *this, val_copy }; } auto HTIF5() const { return ConstField<decltype(*this), 10, 1>{ *this, val_copy }; } // Stream x half transfer interrupt flag (x=7..4) template <typename Targ> auto& HTIF5(Targ val) { return HTIF5().mod(val); } auto TCIF5() { return StableField<decltype(*this), 11, 1>{ *this, val_copy }; } auto TCIF5() const { return ConstField<decltype(*this), 11, 1>{ *this, val_copy }; } // Stream x transfer complete interrupt flag (x=7..4) template <typename Targ> auto& TCIF5(Targ val) { return TCIF5().mod(val); } auto FEIF6() { return StableField<decltype(*this), 16, 1>{ *this, val_copy }; } auto FEIF6() const { return ConstField<decltype(*this), 16, 1>{ *this, val_copy }; } // Stream x FIFO error interrupt flag (x=7..4) template <typename Targ> auto& FEIF6(Targ val) { return FEIF6().mod(val); } auto DMEIF6() { return StableField<decltype(*this), 18, 1>{ *this, val_copy }; } auto DMEIF6() const { return ConstField<decltype(*this), 18, 1>{ *this, val_copy }; } // Stream x direct mode error interrupt flag (x=7..4) template <typename Targ> auto& DMEIF6(Targ val) { return DMEIF6().mod(val); } auto TEIF6() { return StableField<decltype(*this), 19, 1>{ *this, val_copy }; } auto TEIF6() const { return ConstField<decltype(*this), 19, 1>{ *this, val_copy }; } // Stream x transfer error interrupt flag (x=7..4) template <typename Targ> auto& TEIF6(Targ val) { return TEIF6().mod(val); } auto HTIF6() { return StableField<decltype(*this), 20, 1>{ *this, val_copy }; } auto HTIF6() const { return ConstField<decltype(*this), 20, 1>{ *this, val_copy }; } // Stream x half transfer interrupt flag (x=7..4) template <typename Targ> auto& HTIF6(Targ val) { return HTIF6().mod(val); } auto TCIF6() { return StableField<decltype(*this), 21, 1>{ *this, val_copy }; } auto TCIF6() const { return ConstField<decltype(*this), 21, 1>{ *this, val_copy }; } // Stream x transfer complete interrupt flag (x=7..4) template <typename Targ> auto& TCIF6(Targ val) { return TCIF6().mod(val); } auto FEIF7() { return StableField<decltype(*this), 22, 1>{ *this, val_copy }; } auto FEIF7() const { return ConstField<decltype(*this), 22, 1>{ *this, val_copy }; } // Stream x FIFO error interrupt flag (x=7..4) template <typename Targ> auto& FEIF7(Targ val) { return FEIF7().mod(val); } auto DMEIF7() { return StableField<decltype(*this), 24, 1>{ *this, val_copy }; } auto DMEIF7() const { return ConstField<decltype(*this), 24, 1>{ *this, val_copy }; } // Stream x direct mode error interrupt flag (x=7..4) template <typename Targ> auto& DMEIF7(Targ val) { return DMEIF7().mod(val); } auto TEIF7() { return StableField<decltype(*this), 25, 1>{ *this, val_copy }; } auto TEIF7() const { return ConstField<decltype(*this), 25, 1>{ *this, val_copy }; } // Stream x transfer error interrupt flag (x=7..4) template <typename Targ> auto& TEIF7(Targ val) { return TEIF7().mod(val); } auto HTIF7() { return StableField<decltype(*this), 26, 1>{ *this, val_copy }; } auto HTIF7() const { return ConstField<decltype(*this), 26, 1>{ *this, val_copy }; } // Stream x half transfer interrupt flag (x=7..4) template <typename Targ> auto& HTIF7(Targ val) { return HTIF7().mod(val); } auto TCIF7() { return StableField<decltype(*this), 27, 1>{ *this, val_copy }; } auto TCIF7() const { return ConstField<decltype(*this), 27, 1>{ *this, val_copy }; } // Stream x transfer complete interrupt flag (x=7..4) template <typename Targ> auto& TCIF7(Targ val) { return TCIF7().mod(val); } }; } HISR; // low interrupt flag clear register struct LIFCRReg : public Register<std::uint32_t, 0x00000000, LIFCRReg> { using CFEIF0Field = VolatileField<LIFCRReg, 0, 1>; // Stream x clear FIFO error interrupt flag (x = 3..0) auto CFEIF0() { return CFEIF0Field{ *this, val_vol }; } using CDMEIF0Field = VolatileField<LIFCRReg, 2, 1>; // Stream x clear direct mode error interrupt flag (x = 3..0) auto CDMEIF0() { return CDMEIF0Field{ *this, val_vol }; } using CTEIF0Field = VolatileField<LIFCRReg, 3, 1>; // Stream x clear transfer error interrupt flag (x = 3..0) auto CTEIF0() { return CTEIF0Field{ *this, val_vol }; } using CHTIF0Field = VolatileField<LIFCRReg, 4, 1>; // Stream x clear half transfer interrupt flag (x = 3..0) auto CHTIF0() { return CHTIF0Field{ *this, val_vol }; } using CTCIF0Field = VolatileField<LIFCRReg, 5, 1>; // Stream x clear transfer complete interrupt flag (x = 3..0) auto CTCIF0() { return CTCIF0Field{ *this, val_vol }; } using CFEIF1Field = VolatileField<LIFCRReg, 6, 1>; // Stream x clear FIFO error interrupt flag (x = 3..0) auto CFEIF1() { return CFEIF1Field{ *this, val_vol }; } using CDMEIF1Field = VolatileField<LIFCRReg, 8, 1>; // Stream x clear direct mode error interrupt flag (x = 3..0) auto CDMEIF1() { return CDMEIF1Field{ *this, val_vol }; } using CTEIF1Field = VolatileField<LIFCRReg, 9, 1>; // Stream x clear transfer error interrupt flag (x = 3..0) auto CTEIF1() { return CTEIF1Field{ *this, val_vol }; } using CHTIF1Field = VolatileField<LIFCRReg, 10, 1>; // Stream x clear half transfer interrupt flag (x = 3..0) auto CHTIF1() { return CHTIF1Field{ *this, val_vol }; } using CTCIF1Field = VolatileField<LIFCRReg, 11, 1>; // Stream x clear transfer complete interrupt flag (x = 3..0) auto CTCIF1() { return CTCIF1Field{ *this, val_vol }; } using CFEIF2Field = VolatileField<LIFCRReg, 16, 1>; // Stream x clear FIFO error interrupt flag (x = 3..0) auto CFEIF2() { return CFEIF2Field{ *this, val_vol }; } using CDMEIF2Field = VolatileField<LIFCRReg, 18, 1>; // Stream x clear direct mode error interrupt flag (x = 3..0) auto CDMEIF2() { return CDMEIF2Field{ *this, val_vol }; } using CTEIF2Field = VolatileField<LIFCRReg, 19, 1>; // Stream x clear transfer error interrupt flag (x = 3..0) auto CTEIF2() { return CTEIF2Field{ *this, val_vol }; } using CHTIF2Field = VolatileField<LIFCRReg, 20, 1>; // Stream x clear half transfer interrupt flag (x = 3..0) auto CHTIF2() { return CHTIF2Field{ *this, val_vol }; } using CTCIF2Field = VolatileField<LIFCRReg, 21, 1>; // Stream x clear transfer complete interrupt flag (x = 3..0) auto CTCIF2() { return CTCIF2Field{ *this, val_vol }; } using CFEIF3Field = VolatileField<LIFCRReg, 22, 1>; // Stream x clear FIFO error interrupt flag (x = 3..0) auto CFEIF3() { return CFEIF3Field{ *this, val_vol }; } using CDMEIF3Field = VolatileField<LIFCRReg, 24, 1>; // Stream x clear direct mode error interrupt flag (x = 3..0) auto CDMEIF3() { return CDMEIF3Field{ *this, val_vol }; } using CTEIF3Field = VolatileField<LIFCRReg, 25, 1>; // Stream x clear transfer error interrupt flag (x = 3..0) auto CTEIF3() { return CTEIF3Field{ *this, val_vol }; } using CHTIF3Field = VolatileField<LIFCRReg, 26, 1>; // Stream x clear half transfer interrupt flag (x = 3..0) auto CHTIF3() { return CHTIF3Field{ *this, val_vol }; } using CTCIF3Field = VolatileField<LIFCRReg, 27, 1>; // Stream x clear transfer complete interrupt flag (x = 3..0) auto CTCIF3() { return CTCIF3Field{ *this, val_vol }; } struct StableAccess : public StableAccessBase<reg_type> { StableAccess(volatile reg_type& val_vol__, reg_type val_copy__) : StableAccessBase<reg_type>(val_vol__, val_copy__) {} auto CFEIF0() { return StableField<decltype(*this), 0, 1>{ *this, val_copy }; } auto CFEIF0() const { return ConstField<decltype(*this), 0, 1>{ *this, val_copy }; } // Stream x clear FIFO error interrupt flag (x = 3..0) template <typename Targ> auto& CFEIF0(Targ val) { return CFEIF0().mod(val); } auto CDMEIF0() { return StableField<decltype(*this), 2, 1>{ *this, val_copy }; } auto CDMEIF0() const { return ConstField<decltype(*this), 2, 1>{ *this, val_copy }; } // Stream x clear direct mode error interrupt flag (x = 3..0) template <typename Targ> auto& CDMEIF0(Targ val) { return CDMEIF0().mod(val); } auto CTEIF0() { return StableField<decltype(*this), 3, 1>{ *this, val_copy }; } auto CTEIF0() const { return ConstField<decltype(*this), 3, 1>{ *this, val_copy }; } // Stream x clear transfer error interrupt flag (x = 3..0) template <typename Targ> auto& CTEIF0(Targ val) { return CTEIF0().mod(val); } auto CHTIF0() { return StableField<decltype(*this), 4, 1>{ *this, val_copy }; } auto CHTIF0() const { return ConstField<decltype(*this), 4, 1>{ *this, val_copy }; } // Stream x clear half transfer interrupt flag (x = 3..0) template <typename Targ> auto& CHTIF0(Targ val) { return CHTIF0().mod(val); } auto CTCIF0() { return StableField<decltype(*this), 5, 1>{ *this, val_copy }; } auto CTCIF0() const { return ConstField<decltype(*this), 5, 1>{ *this, val_copy }; } // Stream x clear transfer complete interrupt flag (x = 3..0) template <typename Targ> auto& CTCIF0(Targ val) { return CTCIF0().mod(val); } auto CFEIF1() { return StableField<decltype(*this), 6, 1>{ *this, val_copy }; } auto CFEIF1() const { return ConstField<decltype(*this), 6, 1>{ *this, val_copy }; } // Stream x clear FIFO error interrupt flag (x = 3..0) template <typename Targ> auto& CFEIF1(Targ val) { return CFEIF1().mod(val); } auto CDMEIF1() { return StableField<decltype(*this), 8, 1>{ *this, val_copy }; } auto CDMEIF1() const { return ConstField<decltype(*this), 8, 1>{ *this, val_copy }; } // Stream x clear direct mode error interrupt flag (x = 3..0) template <typename Targ> auto& CDMEIF1(Targ val) { return CDMEIF1().mod(val); } auto CTEIF1() { return StableField<decltype(*this), 9, 1>{ *this, val_copy }; } auto CTEIF1() const { return ConstField<decltype(*this), 9, 1>{ *this, val_copy }; } // Stream x clear transfer error interrupt flag (x = 3..0) template <typename Targ> auto& CTEIF1(Targ val) { return CTEIF1().mod(val); } auto CHTIF1() { return StableField<decltype(*this), 10, 1>{ *this, val_copy }; } auto CHTIF1() const { return ConstField<decltype(*this), 10, 1>{ *this, val_copy }; } // Stream x clear half transfer interrupt flag (x = 3..0) template <typename Targ> auto& CHTIF1(Targ val) { return CHTIF1().mod(val); } auto CTCIF1() { return StableField<decltype(*this), 11, 1>{ *this, val_copy }; } auto CTCIF1() const { return ConstField<decltype(*this), 11, 1>{ *this, val_copy }; } // Stream x clear transfer complete interrupt flag (x = 3..0) template <typename Targ> auto& CTCIF1(Targ val) { return CTCIF1().mod(val); } auto CFEIF2() { return StableField<decltype(*this), 16, 1>{ *this, val_copy }; } auto CFEIF2() const { return ConstField<decltype(*this), 16, 1>{ *this, val_copy }; } // Stream x clear FIFO error interrupt flag (x = 3..0) template <typename Targ> auto& CFEIF2(Targ val) { return CFEIF2().mod(val); } auto CDMEIF2() { return StableField<decltype(*this), 18, 1>{ *this, val_copy }; } auto CDMEIF2() const { return ConstField<decltype(*this), 18, 1>{ *this, val_copy }; } // Stream x clear direct mode error interrupt flag (x = 3..0) template <typename Targ> auto& CDMEIF2(Targ val) { return CDMEIF2().mod(val); } auto CTEIF2() { return StableField<decltype(*this), 19, 1>{ *this, val_copy }; } auto CTEIF2() const { return ConstField<decltype(*this), 19, 1>{ *this, val_copy }; } // Stream x clear transfer error interrupt flag (x = 3..0) template <typename Targ> auto& CTEIF2(Targ val) { return CTEIF2().mod(val); } auto CHTIF2() { return StableField<decltype(*this), 20, 1>{ *this, val_copy }; } auto CHTIF2() const { return ConstField<decltype(*this), 20, 1>{ *this, val_copy }; } // Stream x clear half transfer interrupt flag (x = 3..0) template <typename Targ> auto& CHTIF2(Targ val) { return CHTIF2().mod(val); } auto CTCIF2() { return StableField<decltype(*this), 21, 1>{ *this, val_copy }; } auto CTCIF2() const { return ConstField<decltype(*this), 21, 1>{ *this, val_copy }; } // Stream x clear transfer complete interrupt flag (x = 3..0) template <typename Targ> auto& CTCIF2(Targ val) { return CTCIF2().mod(val); } auto CFEIF3() { return StableField<decltype(*this), 22, 1>{ *this, val_copy }; } auto CFEIF3() const { return ConstField<decltype(*this), 22, 1>{ *this, val_copy }; } // Stream x clear FIFO error interrupt flag (x = 3..0) template <typename Targ> auto& CFEIF3(Targ val) { return CFEIF3().mod(val); } auto CDMEIF3() { return StableField<decltype(*this), 24, 1>{ *this, val_copy }; } auto CDMEIF3() const { return ConstField<decltype(*this), 24, 1>{ *this, val_copy }; } // Stream x clear direct mode error interrupt flag (x = 3..0) template <typename Targ> auto& CDMEIF3(Targ val) { return CDMEIF3().mod(val); } auto CTEIF3() { return StableField<decltype(*this), 25, 1>{ *this, val_copy }; } auto CTEIF3() const { return ConstField<decltype(*this), 25, 1>{ *this, val_copy }; } // Stream x clear transfer error interrupt flag (x = 3..0) template <typename Targ> auto& CTEIF3(Targ val) { return CTEIF3().mod(val); } auto CHTIF3() { return StableField<decltype(*this), 26, 1>{ *this, val_copy }; } auto CHTIF3() const { return ConstField<decltype(*this), 26, 1>{ *this, val_copy }; } // Stream x clear half transfer interrupt flag (x = 3..0) template <typename Targ> auto& CHTIF3(Targ val) { return CHTIF3().mod(val); } auto CTCIF3() { return StableField<decltype(*this), 27, 1>{ *this, val_copy }; } auto CTCIF3() const { return ConstField<decltype(*this), 27, 1>{ *this, val_copy }; } // Stream x clear transfer complete interrupt flag (x = 3..0) template <typename Targ> auto& CTCIF3(Targ val) { return CTCIF3().mod(val); } }; } LIFCR; // high interrupt flag clear register struct HIFCRReg : public Register<std::uint32_t, 0x00000000, HIFCRReg> { using CFEIF4Field = VolatileField<HIFCRReg, 0, 1>; // Stream x clear FIFO error interrupt flag (x = 7..4) auto CFEIF4() { return CFEIF4Field{ *this, val_vol }; } using CDMEIF4Field = VolatileField<HIFCRReg, 2, 1>; // Stream x clear direct mode error interrupt flag (x = 7..4) auto CDMEIF4() { return CDMEIF4Field{ *this, val_vol }; } using CTEIF4Field = VolatileField<HIFCRReg, 3, 1>; // Stream x clear transfer error interrupt flag (x = 7..4) auto CTEIF4() { return CTEIF4Field{ *this, val_vol }; } using CHTIF4Field = VolatileField<HIFCRReg, 4, 1>; // Stream x clear half transfer interrupt flag (x = 7..4) auto CHTIF4() { return CHTIF4Field{ *this, val_vol }; } using CTCIF4Field = VolatileField<HIFCRReg, 5, 1>; // Stream x clear transfer complete interrupt flag (x = 7..4) auto CTCIF4() { return CTCIF4Field{ *this, val_vol }; } using CFEIF5Field = VolatileField<HIFCRReg, 6, 1>; // Stream x clear FIFO error interrupt flag (x = 7..4) auto CFEIF5() { return CFEIF5Field{ *this, val_vol }; } using CDMEIF5Field = VolatileField<HIFCRReg, 8, 1>; // Stream x clear direct mode error interrupt flag (x = 7..4) auto CDMEIF5() { return CDMEIF5Field{ *this, val_vol }; } using CTEIF5Field = VolatileField<HIFCRReg, 9, 1>; // Stream x clear transfer error interrupt flag (x = 7..4) auto CTEIF5() { return CTEIF5Field{ *this, val_vol }; } using CHTIF5Field = VolatileField<HIFCRReg, 10, 1>; // Stream x clear half transfer interrupt flag (x = 7..4) auto CHTIF5() { return CHTIF5Field{ *this, val_vol }; } using CTCIF5Field = VolatileField<HIFCRReg, 11, 1>; // Stream x clear transfer complete interrupt flag (x = 7..4) auto CTCIF5() { return CTCIF5Field{ *this, val_vol }; } using CFEIF6Field = VolatileField<HIFCRReg, 16, 1>; // Stream x clear FIFO error interrupt flag (x = 7..4) auto CFEIF6() { return CFEIF6Field{ *this, val_vol }; } using CDMEIF6Field = VolatileField<HIFCRReg, 18, 1>; // Stream x clear direct mode error interrupt flag (x = 7..4) auto CDMEIF6() { return CDMEIF6Field{ *this, val_vol }; } using CTEIF6Field = VolatileField<HIFCRReg, 19, 1>; // Stream x clear transfer error interrupt flag (x = 7..4) auto CTEIF6() { return CTEIF6Field{ *this, val_vol }; } using CHTIF6Field = VolatileField<HIFCRReg, 20, 1>; // Stream x clear half transfer interrupt flag (x = 7..4) auto CHTIF6() { return CHTIF6Field{ *this, val_vol }; } using CTCIF6Field = VolatileField<HIFCRReg, 21, 1>; // Stream x clear transfer complete interrupt flag (x = 7..4) auto CTCIF6() { return CTCIF6Field{ *this, val_vol }; } using CFEIF7Field = VolatileField<HIFCRReg, 22, 1>; // Stream x clear FIFO error interrupt flag (x = 7..4) auto CFEIF7() { return CFEIF7Field{ *this, val_vol }; } using CDMEIF7Field = VolatileField<HIFCRReg, 24, 1>; // Stream x clear direct mode error interrupt flag (x = 7..4) auto CDMEIF7() { return CDMEIF7Field{ *this, val_vol }; } using CTEIF7Field = VolatileField<HIFCRReg, 25, 1>; // Stream x clear transfer error interrupt flag (x = 7..4) auto CTEIF7() { return CTEIF7Field{ *this, val_vol }; } using CHTIF7Field = VolatileField<HIFCRReg, 26, 1>; // Stream x clear half transfer interrupt flag (x = 7..4) auto CHTIF7() { return CHTIF7Field{ *this, val_vol }; } using CTCIF7Field = VolatileField<HIFCRReg, 27, 1>; // Stream x clear transfer complete interrupt flag (x = 7..4) auto CTCIF7() { return CTCIF7Field{ *this, val_vol }; } struct StableAccess : public StableAccessBase<reg_type> { StableAccess(volatile reg_type& val_vol__, reg_type val_copy__) : StableAccessBase<reg_type>(val_vol__, val_copy__) {} auto CFEIF4() { return StableField<decltype(*this), 0, 1>{ *this, val_copy }; } auto CFEIF4() const { return ConstField<decltype(*this), 0, 1>{ *this, val_copy }; } // Stream x clear FIFO error interrupt flag (x = 7..4) template <typename Targ> auto& CFEIF4(Targ val) { return CFEIF4().mod(val); } auto CDMEIF4() { return StableField<decltype(*this), 2, 1>{ *this, val_copy }; } auto CDMEIF4() const { return ConstField<decltype(*this), 2, 1>{ *this, val_copy }; } // Stream x clear direct mode error interrupt flag (x = 7..4) template <typename Targ> auto& CDMEIF4(Targ val) { return CDMEIF4().mod(val); } auto CTEIF4() { return StableField<decltype(*this), 3, 1>{ *this, val_copy }; } auto CTEIF4() const { return ConstField<decltype(*this), 3, 1>{ *this, val_copy }; } // Stream x clear transfer error interrupt flag (x = 7..4) template <typename Targ> auto& CTEIF4(Targ val) { return CTEIF4().mod(val); } auto CHTIF4() { return StableField<decltype(*this), 4, 1>{ *this, val_copy }; } auto CHTIF4() const { return ConstField<decltype(*this), 4, 1>{ *this, val_copy }; } // Stream x clear half transfer interrupt flag (x = 7..4) template <typename Targ> auto& CHTIF4(Targ val) { return CHTIF4().mod(val); } auto CTCIF4() { return StableField<decltype(*this), 5, 1>{ *this, val_copy }; } auto CTCIF4() const { return ConstField<decltype(*this), 5, 1>{ *this, val_copy }; } // Stream x clear transfer complete interrupt flag (x = 7..4) template <typename Targ> auto& CTCIF4(Targ val) { return CTCIF4().mod(val); } auto CFEIF5() { return StableField<decltype(*this), 6, 1>{ *this, val_copy }; } auto CFEIF5() const { return ConstField<decltype(*this), 6, 1>{ *this, val_copy }; } // Stream x clear FIFO error interrupt flag (x = 7..4) template <typename Targ> auto& CFEIF5(Targ val) { return CFEIF5().mod(val); } auto CDMEIF5() { return StableField<decltype(*this), 8, 1>{ *this, val_copy }; } auto CDMEIF5() const { return ConstField<decltype(*this), 8, 1>{ *this, val_copy }; } // Stream x clear direct mode error interrupt flag (x = 7..4) template <typename Targ> auto& CDMEIF5(Targ val) { return CDMEIF5().mod(val); } auto CTEIF5() { return StableField<decltype(*this), 9, 1>{ *this, val_copy }; } auto CTEIF5() const { return ConstField<decltype(*this), 9, 1>{ *this, val_copy }; } // Stream x clear transfer error interrupt flag (x = 7..4) template <typename Targ> auto& CTEIF5(Targ val) { return CTEIF5().mod(val); } auto CHTIF5() { return StableField<decltype(*this), 10, 1>{ *this, val_copy }; } auto CHTIF5() const { return ConstField<decltype(*this), 10, 1>{ *this, val_copy }; } // Stream x clear half transfer interrupt flag (x = 7..4) template <typename Targ> auto& CHTIF5(Targ val) { return CHTIF5().mod(val); } auto CTCIF5() { return StableField<decltype(*this), 11, 1>{ *this, val_copy }; } auto CTCIF5() const { return ConstField<decltype(*this), 11, 1>{ *this, val_copy }; } // Stream x clear transfer complete interrupt flag (x = 7..4) template <typename Targ> auto& CTCIF5(Targ val) { return CTCIF5().mod(val); } auto CFEIF6() { return StableField<decltype(*this), 16, 1>{ *this, val_copy }; } auto CFEIF6() const { return ConstField<decltype(*this), 16, 1>{ *this, val_copy }; } // Stream x clear FIFO error interrupt flag (x = 7..4) template <typename Targ> auto& CFEIF6(Targ val) { return CFEIF6().mod(val); } auto CDMEIF6() { return StableField<decltype(*this), 18, 1>{ *this, val_copy }; } auto CDMEIF6() const { return ConstField<decltype(*this), 18, 1>{ *this, val_copy }; } // Stream x clear direct mode error interrupt flag (x = 7..4) template <typename Targ> auto& CDMEIF6(Targ val) { return CDMEIF6().mod(val); } auto CTEIF6() { return StableField<decltype(*this), 19, 1>{ *this, val_copy }; } auto CTEIF6() const { return ConstField<decltype(*this), 19, 1>{ *this, val_copy }; } // Stream x clear transfer error interrupt flag (x = 7..4) template <typename Targ> auto& CTEIF6(Targ val) { return CTEIF6().mod(val); } auto CHTIF6() { return StableField<decltype(*this), 20, 1>{ *this, val_copy }; } auto CHTIF6() const { return ConstField<decltype(*this), 20, 1>{ *this, val_copy }; } // Stream x clear half transfer interrupt flag (x = 7..4) template <typename Targ> auto& CHTIF6(Targ val) { return CHTIF6().mod(val); } auto CTCIF6() { return StableField<decltype(*this), 21, 1>{ *this, val_copy }; } auto CTCIF6() const { return ConstField<decltype(*this), 21, 1>{ *this, val_copy }; } // Stream x clear transfer complete interrupt flag (x = 7..4) template <typename Targ> auto& CTCIF6(Targ val) { return CTCIF6().mod(val); } auto CFEIF7() { return StableField<decltype(*this), 22, 1>{ *this, val_copy }; } auto CFEIF7() const { return ConstField<decltype(*this), 22, 1>{ *this, val_copy }; } // Stream x clear FIFO error interrupt flag (x = 7..4) template <typename Targ> auto& CFEIF7(Targ val) { return CFEIF7().mod(val); } auto CDMEIF7() { return StableField<decltype(*this), 24, 1>{ *this, val_copy }; } auto CDMEIF7() const { return ConstField<decltype(*this), 24, 1>{ *this, val_copy }; } // Stream x clear direct mode error interrupt flag (x = 7..4) template <typename Targ> auto& CDMEIF7(Targ val) { return CDMEIF7().mod(val); } auto CTEIF7() { return StableField<decltype(*this), 25, 1>{ *this, val_copy }; } auto CTEIF7() const { return ConstField<decltype(*this), 25, 1>{ *this, val_copy }; } // Stream x clear transfer error interrupt flag (x = 7..4) template <typename Targ> auto& CTEIF7(Targ val) { return CTEIF7().mod(val); } auto CHTIF7() { return StableField<decltype(*this), 26, 1>{ *this, val_copy }; } auto CHTIF7() const { return ConstField<decltype(*this), 26, 1>{ *this, val_copy }; } // Stream x clear half transfer interrupt flag (x = 7..4) template <typename Targ> auto& CHTIF7(Targ val) { return CHTIF7().mod(val); } auto CTCIF7() { return StableField<decltype(*this), 27, 1>{ *this, val_copy }; } auto CTCIF7() const { return ConstField<decltype(*this), 27, 1>{ *this, val_copy }; } // Stream x clear transfer complete interrupt flag (x = 7..4) template <typename Targ> auto& CTCIF7(Targ val) { return CTCIF7().mod(val); } }; } HIFCR; // Cluster DMA.S[%s] generated by svd2cpp, array index by ['0', '1', '2', '3', '4', '5', '6', '7'] DMASInterface S[8]; }; //////////////////////////////////////// // Example access of field arrays // //////////////////////////////////////// struct FieldElement { std::uint32_t Offset; std::uint32_t Mask; }; FieldElement eles[] = { { DMAInterface::LISRReg::FEIF0Field::Offset, DMAInterface::LISRReg::FEIF0Field::Mask }, { DMAInterface::LISRReg::FEIF1Field::Offset, DMAInterface::LISRReg::FEIF1Field::Mask }, { DMAInterface::LISRReg::FEIF2Field::Offset, DMAInterface::LISRReg::FEIF2Field::Mask }, { DMAInterface::LISRReg::FEIF3Field::Offset, DMAInterface::LISRReg::FEIF3Field::Mask }, }; void dma_array_example(DMAInterface& dma, std::uint32_t index) { // Access the DMA FIFO error interrupt based on the array index dma.LISR.rmw(eles[index].Offset, eles[index].Mask, true); // Or, read it first, to access multiple fields in one go dma.LISR.read() .mod(eles[0].Offset, eles[0].Mask, true) .mod(eles[1].Offset, eles[1].Mask, false) .write(); }
Become a Patron
Sponsor on GitHub
Donate via PayPal
Compiler Explorer Shop
Source on GitHub
Mailing list
Installed libraries
Wiki
Report an issue
How it works
Contact the author
CE on Mastodon
CE on Bluesky
Statistics
Changelog
Version tree