diff --git a/ChangeLog.md b/ChangeLog.md
new file mode 100644
--- /dev/null
+++ b/ChangeLog.md
@@ -0,0 +1,7 @@
+# Changelog for spirv-reflect-types
+
+## [0.1] - 2022-06-11
+
+* Initial release.
+
+[0.1]: https://gitlab.com/dpwiz/spirv-reflect/-/tree/v0.1-types
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright IC Rainbow (c) 2022
+
+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 Author name here nor the names of other
+      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
+OWNER 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/lib/Data/SpirV/Reflect/BlockVariable.hs b/lib/Data/SpirV/Reflect/BlockVariable.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/SpirV/Reflect/BlockVariable.hs
@@ -0,0 +1,27 @@
+module Data.SpirV.Reflect.BlockVariable
+  ( BlockVariable(..)
+  ) where
+
+import Data.Text (Text)
+import Data.Vector (Vector)
+import GHC.Generics (Generic)
+import Data.Word (Word32)
+
+import Data.SpirV.Reflect.Enums qualified as Enums
+import Data.SpirV.Reflect.Traits qualified as Traits
+import Data.SpirV.Reflect.TypeDescription (TypeDescription)
+
+data BlockVariable = BlockVariable
+  { spirv_id         :: Maybe Word32
+  , name             :: Maybe Text
+  , offset           :: Word32
+  , absolute_offset  :: Word32
+  , size             :: Word32
+  , padded_size      :: Word32
+  , decorations      :: Enums.DecorationFlags
+  , numeric          :: Traits.Numeric
+  , array            :: Traits.Array
+  , members          :: Vector BlockVariable
+  , type_description :: Maybe TypeDescription
+  }
+  deriving (Eq, Show, Generic)
diff --git a/lib/Data/SpirV/Reflect/DescriptorBinding.hs b/lib/Data/SpirV/Reflect/DescriptorBinding.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/SpirV/Reflect/DescriptorBinding.hs
@@ -0,0 +1,40 @@
+module Data.SpirV.Reflect.DescriptorBinding
+  ( DescriptorBinding(..)
+  , WordOffset(..)
+  ) where
+
+import Data.Text (Text)
+import Data.Word (Word32)
+import GHC.Generics (Generic)
+
+import Data.SpirV.Reflect.BlockVariable (BlockVariable)
+import Data.SpirV.Reflect.Enums qualified as Enums
+import Data.SpirV.Reflect.Traits qualified as Traits
+import Data.SpirV.Reflect.TypeDescription (TypeDescription)
+
+data DescriptorBinding = DescriptorBinding
+  { spirv_id               :: Maybe Word32
+  , name                   :: Text
+  , binding                :: Word32
+  , input_attachment_index :: Word32
+  , set                    :: Word32
+  , descriptor_type        :: Enums.DescriptorType
+  , resource_type          :: Enums.ResourceFlags
+  , image                  :: Traits.Image
+  , block                  :: BlockVariable
+  , array                  :: Traits.Array
+  , count                  :: Maybe Word32
+  , accessed               :: Word32
+  , uav_counter_id         :: Word32
+  , uav_counter_binding    :: Maybe DescriptorBinding
+  , type_description       :: Maybe TypeDescription
+  , word_offset            :: WordOffset
+  , decoration_flags       :: Enums.DecorationFlags
+  }
+  deriving (Eq, Show, Generic)
+
+data WordOffset = WordOffset
+  { binding :: Word32
+  , set     :: Word32
+  }
+  deriving (Eq, Show, Generic)
diff --git a/lib/Data/SpirV/Reflect/DescriptorSet.hs b/lib/Data/SpirV/Reflect/DescriptorSet.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/SpirV/Reflect/DescriptorSet.hs
@@ -0,0 +1,13 @@
+module Data.SpirV.Reflect.DescriptorSet where
+
+import Data.Vector (Vector)
+import Data.Word (Word32)
+import GHC.Generics (Generic)
+
+import Data.SpirV.Reflect.DescriptorBinding (DescriptorBinding)
+
+data DescriptorSet = DescriptorSet
+  { set      :: Word32
+  , bindings :: Vector DescriptorBinding
+  }
+  deriving (Eq, Show, Generic)
diff --git a/lib/Data/SpirV/Reflect/Enums.hs b/lib/Data/SpirV/Reflect/Enums.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/SpirV/Reflect/Enums.hs
@@ -0,0 +1,33 @@
+module Data.SpirV.Reflect.Enums
+  ( module Data.SpirV.Reflect.Enums.Common
+  , module Data.SpirV.Reflect.Enums.DecorationFlags
+  , module Data.SpirV.Reflect.Enums.DescriptorType
+  , module Data.SpirV.Reflect.Enums.Format
+  , module Data.SpirV.Reflect.Enums.Generator
+  , module Data.SpirV.Reflect.Enums.ModuleFlags
+  , module Data.SpirV.Reflect.Enums.ResourceFlags
+  , module Data.SpirV.Reflect.Enums.Result
+  , module Data.SpirV.Reflect.Enums.ShaderStage
+  , module Data.SpirV.Reflect.Enums.SpirvBuiltin
+  , module Data.SpirV.Reflect.Enums.SpirvDim
+  , module Data.SpirV.Reflect.Enums.SpirvImageFormat
+  , module Data.SpirV.Reflect.Enums.SpirvOp
+  , module Data.SpirV.Reflect.Enums.SpirvStorageClass
+  , module Data.SpirV.Reflect.Enums.TypeFlags
+  ) where
+
+import Data.SpirV.Reflect.Enums.Common
+import Data.SpirV.Reflect.Enums.DecorationFlags
+import Data.SpirV.Reflect.Enums.DescriptorType
+import Data.SpirV.Reflect.Enums.Format
+import Data.SpirV.Reflect.Enums.Generator
+import Data.SpirV.Reflect.Enums.ModuleFlags
+import Data.SpirV.Reflect.Enums.ResourceFlags
+import Data.SpirV.Reflect.Enums.Result
+import Data.SpirV.Reflect.Enums.ShaderStage
+import Data.SpirV.Reflect.Enums.SpirvBuiltin
+import Data.SpirV.Reflect.Enums.SpirvDim
+import Data.SpirV.Reflect.Enums.SpirvImageFormat
+import Data.SpirV.Reflect.Enums.SpirvOp
+import Data.SpirV.Reflect.Enums.SpirvStorageClass
+import Data.SpirV.Reflect.Enums.TypeFlags
diff --git a/lib/Data/SpirV/Reflect/Enums/Common.hs b/lib/Data/SpirV/Reflect/Enums/Common.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/SpirV/Reflect/Enums/Common.hs
@@ -0,0 +1,32 @@
+module Data.SpirV.Reflect.Enums.Common
+  ( Flags
+  , (.&&.)
+
+  , Word32
+  , Int32
+
+  , IsString
+  , Bits
+  , FiniteBits
+
+  , toLabel
+  ) where
+
+import Data.Word (Word32)
+import Data.Bits (Bits, FiniteBits, (.&.))
+import Data.Int (Int32)
+import Data.String (IsString)
+import Data.IntMap qualified as IntMap
+
+type Flags = Word32
+
+(.&&.) :: Bits a => a -> a -> Bool
+x .&&. flag = x .&. flag == flag
+
+{-# INLINE toLabel #-}
+toLabel :: (Enum i) => [(i, label)] -> i -> Maybe label
+toLabel names key = IntMap.lookup (fromEnum key) indexed
+  where
+    indexed = IntMap.fromList do
+      (i, label) <- names
+      pure (fromEnum i, label)
diff --git a/lib/Data/SpirV/Reflect/Enums/DecorationFlags.hs b/lib/Data/SpirV/Reflect/Enums/DecorationFlags.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/SpirV/Reflect/Enums/DecorationFlags.hs
@@ -0,0 +1,41 @@
+module Data.SpirV.Reflect.Enums.DecorationFlags where
+
+import Data.SpirV.Reflect.Enums.Common
+
+type DecorationFlags = DecorationFlagBits
+
+newtype DecorationFlagBits = DecorationFlagBits Flags
+  deriving newtype (Eq, Ord, Show, Bits, FiniteBits)
+
+pattern DECORATION_NONE :: DecorationFlagBits
+pattern DECORATION_NONE = DecorationFlagBits 0x00000000
+
+pattern DECORATION_BLOCK :: DecorationFlagBits
+pattern DECORATION_BLOCK = DecorationFlagBits 0x00000001
+
+pattern DECORATION_BUFFER_BLOCK :: DecorationFlagBits
+pattern DECORATION_BUFFER_BLOCK = DecorationFlagBits 0x00000002
+
+pattern DECORATION_ROW_MAJOR :: DecorationFlagBits
+pattern DECORATION_ROW_MAJOR = DecorationFlagBits 0x00000004
+
+pattern DECORATION_COLUMN_MAJOR :: DecorationFlagBits
+pattern DECORATION_COLUMN_MAJOR = DecorationFlagBits 0x00000008
+
+pattern DECORATION_BUILT_IN :: DecorationFlagBits
+pattern DECORATION_BUILT_IN = DecorationFlagBits 0x00000010
+
+pattern DECORATION_NOPERSPECTIVE :: DecorationFlagBits
+pattern DECORATION_NOPERSPECTIVE = DecorationFlagBits 0x00000020
+
+pattern DECORATION_FLAT :: DecorationFlagBits
+pattern DECORATION_FLAT = DecorationFlagBits 0x00000040
+
+pattern DECORATION_NON_WRITABLE :: DecorationFlagBits
+pattern DECORATION_NON_WRITABLE = DecorationFlagBits 0x00000080
+
+pattern DECORATION_RELAXED_PRECISION :: DecorationFlagBits
+pattern DECORATION_RELAXED_PRECISION = DecorationFlagBits 0x00000100
+
+pattern DECORATION_NON_READABLE :: DecorationFlagBits
+pattern DECORATION_NON_READABLE = DecorationFlagBits 0x00000200
diff --git a/lib/Data/SpirV/Reflect/Enums/DescriptorType.hs b/lib/Data/SpirV/Reflect/Enums/DescriptorType.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/SpirV/Reflect/Enums/DescriptorType.hs
@@ -0,0 +1,61 @@
+module Data.SpirV.Reflect.Enums.DescriptorType where
+
+import Data.SpirV.Reflect.Enums.Common
+
+newtype DescriptorType = DescriptorType Int
+  deriving newtype (Eq, Ord, Show, Enum)
+
+pattern DESCRIPTOR_TYPE_SAMPLER :: DescriptorType
+pattern DESCRIPTOR_TYPE_SAMPLER = DescriptorType 0
+
+pattern DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER :: DescriptorType
+pattern DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER = DescriptorType 1
+
+pattern DESCRIPTOR_TYPE_SAMPLED_IMAGE :: DescriptorType
+pattern DESCRIPTOR_TYPE_SAMPLED_IMAGE = DescriptorType 2
+
+pattern DESCRIPTOR_TYPE_STORAGE_IMAGE :: DescriptorType
+pattern DESCRIPTOR_TYPE_STORAGE_IMAGE = DescriptorType 3
+
+pattern DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER :: DescriptorType
+pattern DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER = DescriptorType 4
+
+pattern DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER :: DescriptorType
+pattern DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER = DescriptorType 5
+
+pattern DESCRIPTOR_TYPE_UNIFORM_BUFFER :: DescriptorType
+pattern DESCRIPTOR_TYPE_UNIFORM_BUFFER = DescriptorType 6
+
+pattern DESCRIPTOR_TYPE_STORAGE_BUFFER :: DescriptorType
+pattern DESCRIPTOR_TYPE_STORAGE_BUFFER = DescriptorType 7
+
+pattern DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC :: DescriptorType
+pattern DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC = DescriptorType 8
+
+pattern DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC :: DescriptorType
+pattern DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC = DescriptorType 9
+
+pattern DESCRIPTOR_TYPE_INPUT_ATTACHMENT :: DescriptorType
+pattern DESCRIPTOR_TYPE_INPUT_ATTACHMENT = DescriptorType 10
+
+pattern DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR :: DescriptorType
+pattern DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR = DescriptorType 1000150000
+
+descriptorTypeName :: IsString label => DescriptorType -> Maybe label
+descriptorTypeName = toLabel descriptorTypeNames
+
+descriptorTypeNames :: IsString label => [(DescriptorType, label)]
+descriptorTypeNames =
+  [ (DESCRIPTOR_TYPE_SAMPLER, "SAMPLER")
+  , (DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "COMBINED_IMAGE_SAMPLER")
+  , (DESCRIPTOR_TYPE_SAMPLED_IMAGE, "SAMPLED_IMAGE")
+  , (DESCRIPTOR_TYPE_STORAGE_IMAGE, "STORAGE_IMAGE")
+  , (DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, "UNIFORM_TEXEL_BUFFER")
+  , (DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "STORAGE_TEXEL_BUFFER")
+  , (DESCRIPTOR_TYPE_UNIFORM_BUFFER, "UNIFORM_BUFFER")
+  , (DESCRIPTOR_TYPE_STORAGE_BUFFER, "STORAGE_BUFFER")
+  , (DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, "UNIFORM_BUFFER_DYNAMIC")
+  , (DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "STORAGE_BUFFER_DYNAMIC")
+  , (DESCRIPTOR_TYPE_INPUT_ATTACHMENT, "INPUT_ATTACHMENT")
+  , (DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, "ACCELERATION_STRUCTURE_KHR")
+  ]
diff --git a/lib/Data/SpirV/Reflect/Enums/Format.hs b/lib/Data/SpirV/Reflect/Enums/Format.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/SpirV/Reflect/Enums/Format.hs
@@ -0,0 +1,113 @@
+module Data.SpirV.Reflect.Enums.Format where
+
+import Data.SpirV.Reflect.Enums.Common
+
+newtype Format = Format Int
+  deriving (Eq, Ord, Show, Enum)
+
+pattern FORMAT_UNDEFINED :: Format
+pattern FORMAT_UNDEFINED = Format 0
+
+pattern FORMAT_R32_UINT :: Format
+pattern FORMAT_R32_UINT = Format 98
+
+pattern FORMAT_R32_SINT :: Format
+pattern FORMAT_R32_SINT = Format 99
+
+pattern FORMAT_R32_SFLOAT :: Format
+pattern FORMAT_R32_SFLOAT = Format 100
+
+pattern FORMAT_R32G32_UINT :: Format
+pattern FORMAT_R32G32_UINT = Format 101
+
+pattern FORMAT_R32G32_SINT :: Format
+pattern FORMAT_R32G32_SINT = Format 102
+
+pattern FORMAT_R32G32_SFLOAT :: Format
+pattern FORMAT_R32G32_SFLOAT = Format 103
+
+pattern FORMAT_R32G32B32_UINT :: Format
+pattern FORMAT_R32G32B32_UINT = Format 104
+
+pattern FORMAT_R32G32B32_SINT :: Format
+pattern FORMAT_R32G32B32_SINT = Format 105
+
+pattern FORMAT_R32G32B32_SFLOAT :: Format
+pattern FORMAT_R32G32B32_SFLOAT = Format 106
+
+pattern FORMAT_R32G32B32A32_UINT :: Format
+pattern FORMAT_R32G32B32A32_UINT = Format 107
+
+pattern FORMAT_R32G32B32A32_SINT :: Format
+pattern FORMAT_R32G32B32A32_SINT = Format 108
+
+pattern FORMAT_R32G32B32A32_SFLOAT :: Format
+pattern FORMAT_R32G32B32A32_SFLOAT = Format 109
+
+pattern FORMAT_R64_UINT :: Format
+pattern FORMAT_R64_UINT = Format 110
+
+pattern FORMAT_R64_SINT :: Format
+pattern FORMAT_R64_SINT = Format 111
+
+pattern FORMAT_R64_SFLOAT :: Format
+pattern FORMAT_R64_SFLOAT = Format 112
+
+pattern FORMAT_R64G64_UINT :: Format
+pattern FORMAT_R64G64_UINT = Format 113
+
+pattern FORMAT_R64G64_SINT :: Format
+pattern FORMAT_R64G64_SINT = Format 114
+
+pattern FORMAT_R64G64_SFLOAT :: Format
+pattern FORMAT_R64G64_SFLOAT = Format 115
+
+pattern FORMAT_R64G64B64_UINT :: Format
+pattern FORMAT_R64G64B64_UINT = Format 116
+
+pattern FORMAT_R64G64B64_SINT :: Format
+pattern FORMAT_R64G64B64_SINT = Format 117
+
+pattern FORMAT_R64G64B64_SFLOAT :: Format
+pattern FORMAT_R64G64B64_SFLOAT = Format 118
+
+pattern FORMAT_R64G64B64A64_UINT :: Format
+pattern FORMAT_R64G64B64A64_UINT = Format 119
+
+pattern FORMAT_R64G64B64A64_SINT :: Format
+pattern FORMAT_R64G64B64A64_SINT = Format 120
+
+pattern FORMAT_R64G64B64A64_SFLOAT :: Format
+pattern FORMAT_R64G64B64A64_SFLOAT = Format 121
+
+formatName :: IsString label => Format -> Maybe label
+formatName = toLabel formatNames
+
+formatNames :: IsString label => [(Format, label)]
+formatNames =
+  [ (FORMAT_UNDEFINED, "UNDEFINED")
+  , (FORMAT_R32_UINT, "R32_UINT")
+  , (FORMAT_R32_SINT, "R32_SINT")
+  , (FORMAT_R32_SFLOAT, "R32_SFLOAT")
+  , (FORMAT_R32G32_UINT, "R32G32_UINT")
+  , (FORMAT_R32G32_SINT, "R32G32_SINT")
+  , (FORMAT_R32G32_SFLOAT, "R32G32_SFLOAT")
+  , (FORMAT_R32G32B32_UINT, "R32G32B32_UINT")
+  , (FORMAT_R32G32B32_SINT, "R32G32B32_SINT")
+  , (FORMAT_R32G32B32_SFLOAT, "R32G32B32_SFLOAT")
+  , (FORMAT_R32G32B32A32_UINT, "R32G32B32A32_UINT")
+  , (FORMAT_R32G32B32A32_SINT, "R32G32B32A32_SINT")
+  , (FORMAT_R32G32B32A32_SFLOAT, "R32G32B32A32_SFLOAT")
+  , (FORMAT_R64_UINT, "R64_UINT")
+  , (FORMAT_R64_SINT, "R64_SINT")
+  , (FORMAT_R64_SFLOAT, "R64_SFLOAT")
+  , (FORMAT_R64G64_UINT, "R64G64_UINT")
+  , (FORMAT_R64G64_SINT, "R64G64_SINT")
+  , (FORMAT_R64G64_SFLOAT, "R64G64_SFLOAT")
+  , (FORMAT_R64G64B64_UINT, "R64G64B64_UINT")
+  , (FORMAT_R64G64B64_SINT, "R64G64B64_SINT")
+  , (FORMAT_R64G64B64_SFLOAT, "R64G64B64_SFLOAT")
+  , (FORMAT_R64G64B64A64_UINT, "R64G64B64A64_UINT")
+  , (FORMAT_R64G64B64A64_SINT, "R64G64B64A64_SINT")
+  , (FORMAT_R64G64B64A64_SFLOAT, "R64G64B64A64_SFLOAT")
+  ]
diff --git a/lib/Data/SpirV/Reflect/Enums/Generator.hs b/lib/Data/SpirV/Reflect/Enums/Generator.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/SpirV/Reflect/Enums/Generator.hs
@@ -0,0 +1,34 @@
+module Data.SpirV.Reflect.Enums.Generator where
+
+newtype Generator = Generator Int
+  deriving newtype (Eq, Ord, Show, Enum)
+
+pattern GENERATOR_KHRONOS_LLVM_SPIRV_TRANSLATOR :: Generator
+pattern GENERATOR_KHRONOS_LLVM_SPIRV_TRANSLATOR = Generator 6
+
+pattern GENERATOR_KHRONOS_SPIRV_TOOLS_ASSEMBLER :: Generator
+pattern GENERATOR_KHRONOS_SPIRV_TOOLS_ASSEMBLER = Generator 7
+
+pattern GENERATOR_KHRONOS_GLSLANG_REFERENCE_FRONT_END :: Generator
+pattern GENERATOR_KHRONOS_GLSLANG_REFERENCE_FRONT_END = Generator 8
+
+pattern GENERATOR_GOOGLE_SHADERC_OVER_GLSLANG :: Generator
+pattern GENERATOR_GOOGLE_SHADERC_OVER_GLSLANG = Generator 13
+
+pattern GENERATOR_GOOGLE_SPIREGG :: Generator
+pattern GENERATOR_GOOGLE_SPIREGG = Generator 14
+
+pattern GENERATOR_GOOGLE_RSPIRV :: Generator
+pattern GENERATOR_GOOGLE_RSPIRV = Generator 15
+
+pattern GENERATOR_X_LEGEND_MESA_MESAIR_SPIRV_TRANSLATOR :: Generator
+pattern GENERATOR_X_LEGEND_MESA_MESAIR_SPIRV_TRANSLATOR = Generator 16
+
+pattern GENERATOR_KHRONOS_SPIRV_TOOLS_LINKER :: Generator
+pattern GENERATOR_KHRONOS_SPIRV_TOOLS_LINKER = Generator 17
+
+pattern GENERATOR_WINE_VKD3D_SHADER_COMPILER :: Generator
+pattern GENERATOR_WINE_VKD3D_SHADER_COMPILER = Generator 18
+
+pattern GENERATOR_CLAY_CLAY_SHADER_COMPILER :: Generator
+pattern GENERATOR_CLAY_CLAY_SHADER_COMPILER = Generator 19
diff --git a/lib/Data/SpirV/Reflect/Enums/ModuleFlags.hs b/lib/Data/SpirV/Reflect/Enums/ModuleFlags.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/SpirV/Reflect/Enums/ModuleFlags.hs
@@ -0,0 +1,14 @@
+module Data.SpirV.Reflect.Enums.ModuleFlags where
+
+import Data.SpirV.Reflect.Enums.Common
+
+type ModuleFlags = ModuleFlagBits
+
+newtype ModuleFlagBits = ModuleFlagBits Word32
+  deriving newtype (Eq, Ord, Show, Bits, FiniteBits)
+
+pattern MODULE_FLAG_NONE :: ModuleFlagBits
+pattern MODULE_FLAG_NONE = ModuleFlagBits 0x00000000
+
+pattern MODULE_FLAG_NO_COPY :: ModuleFlagBits
+pattern MODULE_FLAG_NO_COPY = ModuleFlagBits 0x00000001
diff --git a/lib/Data/SpirV/Reflect/Enums/ResourceFlags.hs b/lib/Data/SpirV/Reflect/Enums/ResourceFlags.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/SpirV/Reflect/Enums/ResourceFlags.hs
@@ -0,0 +1,23 @@
+module Data.SpirV.Reflect.Enums.ResourceFlags where
+
+import Data.SpirV.Reflect.Enums.Common
+
+type ResourceFlags = ResourceFlagBits
+
+newtype ResourceFlagBits = ResourceFlagBits Flags
+  deriving newtype (Eq, Ord, Show, Bits, FiniteBits)
+
+pattern RESOURCE_FLAG_UNDEFINED :: ResourceFlagBits
+pattern RESOURCE_FLAG_UNDEFINED = ResourceFlagBits 0x00000000
+
+pattern RESOURCE_FLAG_SAMPLER :: ResourceFlagBits
+pattern RESOURCE_FLAG_SAMPLER = ResourceFlagBits 0x00000001
+
+pattern RESOURCE_FLAG_CBV :: ResourceFlagBits
+pattern RESOURCE_FLAG_CBV = ResourceFlagBits 0x00000002
+
+pattern RESOURCE_FLAG_SRV :: ResourceFlagBits
+pattern RESOURCE_FLAG_SRV = ResourceFlagBits 0x00000004
+
+pattern RESOURCE_FLAG_UAV :: ResourceFlagBits
+pattern RESOURCE_FLAG_UAV = ResourceFlagBits 0x00000008
diff --git a/lib/Data/SpirV/Reflect/Enums/Result.hs b/lib/Data/SpirV/Reflect/Enums/Result.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/SpirV/Reflect/Enums/Result.hs
@@ -0,0 +1,25 @@
+module Data.SpirV.Reflect.Enums.Result where
+
+data Result
+  = SUCCESS
+  | NOT_READY
+  | ERROR_PARSE_FAILED
+  | ERROR_ALLOC_FAILED
+  | ERROR_RANGE_EXCEEDED
+  | ERROR_NULL_POINTER
+  | ERROR_INTERNAL_ERROR
+  | ERROR_COUNT_MISMATCH
+  | ERROR_ELEMENT_NOT_FOUND
+  | ERROR_SPIRV_INVALID_CODE_SIZE
+  | ERROR_SPIRV_INVALID_MAGIC_NUMBER
+  | ERROR_SPIRV_UNEXPECTED_EOF
+  | ERROR_SPIRV_INVALID_ID_REFERENCE
+  | ERROR_SPIRV_SET_NUMBER_OVERFLOW
+  | ERROR_SPIRV_INVALID_STORAGE_CLASS
+  | ERROR_SPIRV_RECURSION
+  | ERROR_SPIRV_INVALID_INSTRUCTION
+  | ERROR_SPIRV_UNEXPECTED_BLOCK_DATA
+  | ERROR_SPIRV_INVALID_BLOCK_MEMBER_REFERENCE
+  | ERROR_SPIRV_INVALID_ENTRY_POINT
+  | ERROR_SPIRV_INVALID_EXECUTION_MODE
+  deriving (Eq, Ord, Show, Enum, Bounded)
diff --git a/lib/Data/SpirV/Reflect/Enums/ShaderStage.hs b/lib/Data/SpirV/Reflect/Enums/ShaderStage.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/SpirV/Reflect/Enums/ShaderStage.hs
@@ -0,0 +1,76 @@
+module Data.SpirV.Reflect.Enums.ShaderStage where
+
+import Control.Monad (guard)
+
+import Data.SpirV.Reflect.Enums.Common
+
+type ShaderStage = ShaderStageFlagBits
+
+newtype ShaderStageFlagBits = ShaderStageFlagBits Flags
+  deriving newtype (Eq, Ord, Show, Bits, FiniteBits)
+
+pattern SHADER_STAGE_VERTEX_BIT :: ShaderStageFlagBits
+pattern SHADER_STAGE_VERTEX_BIT = ShaderStageFlagBits 0x00000001
+
+pattern SHADER_STAGE_TESSELLATION_CONTROL_BIT :: ShaderStageFlagBits
+pattern SHADER_STAGE_TESSELLATION_CONTROL_BIT = ShaderStageFlagBits 0x00000002
+
+pattern SHADER_STAGE_TESSELLATION_EVALUATION_BIT :: ShaderStageFlagBits
+pattern SHADER_STAGE_TESSELLATION_EVALUATION_BIT = ShaderStageFlagBits 0x00000004
+
+pattern SHADER_STAGE_GEOMETRY_BIT :: ShaderStageFlagBits
+pattern SHADER_STAGE_GEOMETRY_BIT = ShaderStageFlagBits 0x00000008
+
+pattern SHADER_STAGE_FRAGMENT_BIT :: ShaderStageFlagBits
+pattern SHADER_STAGE_FRAGMENT_BIT = ShaderStageFlagBits 0x00000010
+
+pattern SHADER_STAGE_COMPUTE_BIT :: ShaderStageFlagBits
+pattern SHADER_STAGE_COMPUTE_BIT = ShaderStageFlagBits 0x00000020
+
+pattern SHADER_STAGE_TASK_BIT_NV :: ShaderStageFlagBits
+pattern SHADER_STAGE_TASK_BIT_NV = ShaderStageFlagBits 0x00000040
+
+pattern SHADER_STAGE_MESH_BIT_NV :: ShaderStageFlagBits
+pattern SHADER_STAGE_MESH_BIT_NV = ShaderStageFlagBits 0x00000080
+
+pattern SHADER_STAGE_RAYGEN_BIT_KHR :: ShaderStageFlagBits
+pattern SHADER_STAGE_RAYGEN_BIT_KHR = ShaderStageFlagBits 0x00000100
+
+pattern SHADER_STAGE_ANY_HIT_BIT_KHR :: ShaderStageFlagBits
+pattern SHADER_STAGE_ANY_HIT_BIT_KHR = ShaderStageFlagBits 0x00000200
+
+pattern SHADER_STAGE_CLOSEST_HIT_BIT_KHR :: ShaderStageFlagBits
+pattern SHADER_STAGE_CLOSEST_HIT_BIT_KHR = ShaderStageFlagBits 0x00000400
+
+pattern SHADER_STAGE_MISS_BIT_KHR :: ShaderStageFlagBits
+pattern SHADER_STAGE_MISS_BIT_KHR = ShaderStageFlagBits 0x00000800
+
+pattern SHADER_STAGE_INTERSECTION_BIT_KHR :: ShaderStageFlagBits
+pattern SHADER_STAGE_INTERSECTION_BIT_KHR = ShaderStageFlagBits 0x00001000
+
+pattern SHADER_STAGE_CALLABLE_BIT_KHR :: ShaderStageFlagBits
+pattern SHADER_STAGE_CALLABLE_BIT_KHR = ShaderStageFlagBits 0x00002000
+
+names :: IsString label => ShaderStageFlagBits -> [label]
+names bits = do
+  (flag, name) <- bitNames
+  guard $ bits .&&. flag
+  pure name
+
+bitNames :: IsString label => [(ShaderStageFlagBits, label)]
+bitNames =
+  [ (SHADER_STAGE_VERTEX_BIT, "VERTEX")
+  , (SHADER_STAGE_TESSELLATION_CONTROL_BIT, "TESSELLATION_CONTROL")
+  , (SHADER_STAGE_TESSELLATION_EVALUATION_BIT, "TESSELLATION_EVALUATION")
+  , (SHADER_STAGE_GEOMETRY_BIT, "GEOMETRY")
+  , (SHADER_STAGE_FRAGMENT_BIT, "FRAGMENT")
+  , (SHADER_STAGE_COMPUTE_BIT, "COMPUTE")
+  , (SHADER_STAGE_TASK_BIT_NV, "TASK")
+  , (SHADER_STAGE_MESH_BIT_NV, "MESH")
+  , (SHADER_STAGE_RAYGEN_BIT_KHR, "RAYGEN")
+  , (SHADER_STAGE_ANY_HIT_BIT_KHR, "ANY_HIT")
+  , (SHADER_STAGE_CLOSEST_HIT_BIT_KHR, "CLOSEST_HIT")
+  , (SHADER_STAGE_MISS_BIT_KHR, "MISS")
+  , (SHADER_STAGE_INTERSECTION_BIT_KHR, "INTERSECTION")
+  , (SHADER_STAGE_CALLABLE_BIT_KHR, "CALLABLE")
+  ]
diff --git a/lib/Data/SpirV/Reflect/Enums/SpirvBuiltin.hs b/lib/Data/SpirV/Reflect/Enums/SpirvBuiltin.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/SpirV/Reflect/Enums/SpirvBuiltin.hs
@@ -0,0 +1,375 @@
+module Data.SpirV.Reflect.Enums.SpirvBuiltin where
+
+import Data.SpirV.Reflect.Enums.Common
+
+newtype BuiltIn = BuiltIn Int32
+  deriving newtype (Eq, Ord, Show, Enum, Bounded)
+
+pattern BuiltInPosition :: BuiltIn
+pattern BuiltInPosition = BuiltIn 0
+
+pattern BuiltInPointSize :: BuiltIn
+pattern BuiltInPointSize = BuiltIn 1
+
+pattern BuiltInClipDistance :: BuiltIn
+pattern BuiltInClipDistance = BuiltIn 3
+
+pattern BuiltInCullDistance :: BuiltIn
+pattern BuiltInCullDistance = BuiltIn 4
+
+pattern BuiltInVertexId :: BuiltIn
+pattern BuiltInVertexId = BuiltIn 5
+
+pattern BuiltInInstanceId :: BuiltIn
+pattern BuiltInInstanceId = BuiltIn 6
+
+pattern BuiltInPrimitiveId :: BuiltIn
+pattern BuiltInPrimitiveId = BuiltIn 7
+
+pattern BuiltInInvocationId :: BuiltIn
+pattern BuiltInInvocationId = BuiltIn 8
+
+pattern BuiltInLayer :: BuiltIn
+pattern BuiltInLayer = BuiltIn 9
+
+pattern BuiltInViewportIndex :: BuiltIn
+pattern BuiltInViewportIndex = BuiltIn 10
+
+pattern BuiltInTessLevelOuter :: BuiltIn
+pattern BuiltInTessLevelOuter = BuiltIn 11
+
+pattern BuiltInTessLevelInner :: BuiltIn
+pattern BuiltInTessLevelInner = BuiltIn 12
+
+pattern BuiltInTessCoord :: BuiltIn
+pattern BuiltInTessCoord = BuiltIn 13
+
+pattern BuiltInPatchVertices :: BuiltIn
+pattern BuiltInPatchVertices = BuiltIn 14
+
+pattern BuiltInFragCoord :: BuiltIn
+pattern BuiltInFragCoord = BuiltIn 15
+
+pattern BuiltInPointCoord :: BuiltIn
+pattern BuiltInPointCoord = BuiltIn 16
+
+pattern BuiltInFrontFacing :: BuiltIn
+pattern BuiltInFrontFacing = BuiltIn 17
+
+pattern BuiltInSampleId :: BuiltIn
+pattern BuiltInSampleId = BuiltIn 18
+
+pattern BuiltInSamplePosition :: BuiltIn
+pattern BuiltInSamplePosition = BuiltIn 19
+
+pattern BuiltInSampleMask :: BuiltIn
+pattern BuiltInSampleMask = BuiltIn 20
+
+pattern BuiltInFragDepth :: BuiltIn
+pattern BuiltInFragDepth = BuiltIn 22
+
+pattern BuiltInHelperInvocation :: BuiltIn
+pattern BuiltInHelperInvocation = BuiltIn 23
+
+pattern BuiltInNumWorkgroups :: BuiltIn
+pattern BuiltInNumWorkgroups = BuiltIn 24
+
+pattern BuiltInWorkgroupSize :: BuiltIn
+pattern BuiltInWorkgroupSize = BuiltIn 25
+
+pattern BuiltInWorkgroupId :: BuiltIn
+pattern BuiltInWorkgroupId = BuiltIn 26
+
+pattern BuiltInLocalInvocationId :: BuiltIn
+pattern BuiltInLocalInvocationId = BuiltIn 27
+
+pattern BuiltInGlobalInvocationId :: BuiltIn
+pattern BuiltInGlobalInvocationId = BuiltIn 28
+
+pattern BuiltInLocalInvocationIndex :: BuiltIn
+pattern BuiltInLocalInvocationIndex = BuiltIn 29
+
+pattern BuiltInWorkDim :: BuiltIn
+pattern BuiltInWorkDim = BuiltIn 30
+
+pattern BuiltInGlobalSize :: BuiltIn
+pattern BuiltInGlobalSize = BuiltIn 31
+
+pattern BuiltInEnqueuedWorkgroupSize :: BuiltIn
+pattern BuiltInEnqueuedWorkgroupSize = BuiltIn 32
+
+pattern BuiltInGlobalOffset :: BuiltIn
+pattern BuiltInGlobalOffset = BuiltIn 33
+
+pattern BuiltInGlobalLinearId :: BuiltIn
+pattern BuiltInGlobalLinearId = BuiltIn 34
+
+pattern BuiltInSubgroupSize :: BuiltIn
+pattern BuiltInSubgroupSize = BuiltIn 36
+
+pattern BuiltInSubgroupMaxSize :: BuiltIn
+pattern BuiltInSubgroupMaxSize = BuiltIn 37
+
+pattern BuiltInNumSubgroups :: BuiltIn
+pattern BuiltInNumSubgroups = BuiltIn 38
+
+pattern BuiltInNumEnqueuedSubgroups :: BuiltIn
+pattern BuiltInNumEnqueuedSubgroups = BuiltIn 39
+
+pattern BuiltInSubgroupId :: BuiltIn
+pattern BuiltInSubgroupId = BuiltIn 40
+
+pattern BuiltInSubgroupLocalInvocationId :: BuiltIn
+pattern BuiltInSubgroupLocalInvocationId = BuiltIn 41
+
+pattern BuiltInVertexIndex :: BuiltIn
+pattern BuiltInVertexIndex = BuiltIn 42
+
+pattern BuiltInInstanceIndex :: BuiltIn
+pattern BuiltInInstanceIndex = BuiltIn 43
+
+pattern BuiltInSubgroupEqMask :: BuiltIn
+pattern BuiltInSubgroupEqMask = BuiltIn 4416
+
+pattern BuiltInSubgroupEqMaskKHR :: BuiltIn
+pattern BuiltInSubgroupEqMaskKHR = BuiltIn 4416
+
+pattern BuiltInSubgroupGeMask :: BuiltIn
+pattern BuiltInSubgroupGeMask = BuiltIn 4417
+
+pattern BuiltInSubgroupGeMaskKHR :: BuiltIn
+pattern BuiltInSubgroupGeMaskKHR = BuiltIn 4417
+
+pattern BuiltInSubgroupGtMask :: BuiltIn
+pattern BuiltInSubgroupGtMask = BuiltIn 4418
+
+pattern BuiltInSubgroupGtMaskKHR :: BuiltIn
+pattern BuiltInSubgroupGtMaskKHR = BuiltIn 4418
+
+pattern BuiltInSubgroupLeMask :: BuiltIn
+pattern BuiltInSubgroupLeMask = BuiltIn 4419
+
+pattern BuiltInSubgroupLeMaskKHR :: BuiltIn
+pattern BuiltInSubgroupLeMaskKHR = BuiltIn 4419
+
+pattern BuiltInSubgroupLtMask :: BuiltIn
+pattern BuiltInSubgroupLtMask = BuiltIn 4420
+
+pattern BuiltInSubgroupLtMaskKHR :: BuiltIn
+pattern BuiltInSubgroupLtMaskKHR = BuiltIn 4420
+
+pattern BuiltInBaseVertex :: BuiltIn
+pattern BuiltInBaseVertex = BuiltIn 4424
+
+pattern BuiltInBaseInstance :: BuiltIn
+pattern BuiltInBaseInstance = BuiltIn 4425
+
+pattern BuiltInDrawIndex :: BuiltIn
+pattern BuiltInDrawIndex = BuiltIn 4426
+
+pattern BuiltInPrimitiveShadingRateKHR :: BuiltIn
+pattern BuiltInPrimitiveShadingRateKHR = BuiltIn 4432
+
+pattern BuiltInDeviceIndex :: BuiltIn
+pattern BuiltInDeviceIndex = BuiltIn 4438
+
+pattern BuiltInViewIndex :: BuiltIn
+pattern BuiltInViewIndex = BuiltIn 4440
+
+pattern BuiltInShadingRateKHR :: BuiltIn
+pattern BuiltInShadingRateKHR = BuiltIn 4444
+
+pattern BuiltInBaryCoordNoPerspAMD :: BuiltIn
+pattern BuiltInBaryCoordNoPerspAMD = BuiltIn 4992
+
+pattern BuiltInBaryCoordNoPerspCentroidAMD :: BuiltIn
+pattern BuiltInBaryCoordNoPerspCentroidAMD = BuiltIn 4993
+
+pattern BuiltInBaryCoordNoPerspSampleAMD :: BuiltIn
+pattern BuiltInBaryCoordNoPerspSampleAMD = BuiltIn 4994
+
+pattern BuiltInBaryCoordSmoothAMD :: BuiltIn
+pattern BuiltInBaryCoordSmoothAMD = BuiltIn 4995
+
+pattern BuiltInBaryCoordSmoothCentroidAMD :: BuiltIn
+pattern BuiltInBaryCoordSmoothCentroidAMD = BuiltIn 4996
+
+pattern BuiltInBaryCoordSmoothSampleAMD :: BuiltIn
+pattern BuiltInBaryCoordSmoothSampleAMD = BuiltIn 4997
+
+pattern BuiltInBaryCoordPullModelAMD :: BuiltIn
+pattern BuiltInBaryCoordPullModelAMD = BuiltIn 4998
+
+pattern BuiltInFragStencilRefEXT :: BuiltIn
+pattern BuiltInFragStencilRefEXT = BuiltIn 5014
+
+pattern BuiltInViewportMaskNV :: BuiltIn
+pattern BuiltInViewportMaskNV = BuiltIn 5253
+
+pattern BuiltInSecondaryPositionNV :: BuiltIn
+pattern BuiltInSecondaryPositionNV = BuiltIn 5257
+
+pattern BuiltInSecondaryViewportMaskNV :: BuiltIn
+pattern BuiltInSecondaryViewportMaskNV = BuiltIn 5258
+
+pattern BuiltInPositionPerViewNV :: BuiltIn
+pattern BuiltInPositionPerViewNV = BuiltIn 5261
+
+pattern BuiltInViewportMaskPerViewNV :: BuiltIn
+pattern BuiltInViewportMaskPerViewNV = BuiltIn 5262
+
+pattern BuiltInFullyCoveredEXT :: BuiltIn
+pattern BuiltInFullyCoveredEXT = BuiltIn 5264
+
+pattern BuiltInTaskCountNV :: BuiltIn
+pattern BuiltInTaskCountNV = BuiltIn 5274
+
+pattern BuiltInPrimitiveCountNV :: BuiltIn
+pattern BuiltInPrimitiveCountNV = BuiltIn 5275
+
+pattern BuiltInPrimitiveIndicesNV :: BuiltIn
+pattern BuiltInPrimitiveIndicesNV = BuiltIn 5276
+
+pattern BuiltInClipDistancePerViewNV :: BuiltIn
+pattern BuiltInClipDistancePerViewNV = BuiltIn 5277
+
+pattern BuiltInCullDistancePerViewNV :: BuiltIn
+pattern BuiltInCullDistancePerViewNV = BuiltIn 5278
+
+pattern BuiltInLayerPerViewNV :: BuiltIn
+pattern BuiltInLayerPerViewNV = BuiltIn 5279
+
+pattern BuiltInMeshViewCountNV :: BuiltIn
+pattern BuiltInMeshViewCountNV = BuiltIn 5280
+
+pattern BuiltInMeshViewIndicesNV :: BuiltIn
+pattern BuiltInMeshViewIndicesNV = BuiltIn 5281
+
+pattern BuiltInBaryCoordKHR :: BuiltIn
+pattern BuiltInBaryCoordKHR = BuiltIn 5286
+
+pattern BuiltInBaryCoordNV :: BuiltIn
+pattern BuiltInBaryCoordNV = BuiltIn 5286
+
+pattern BuiltInBaryCoordNoPerspKHR :: BuiltIn
+pattern BuiltInBaryCoordNoPerspKHR = BuiltIn 5287
+
+pattern BuiltInBaryCoordNoPerspNV :: BuiltIn
+pattern BuiltInBaryCoordNoPerspNV = BuiltIn 5287
+
+pattern BuiltInFragSizeEXT :: BuiltIn
+pattern BuiltInFragSizeEXT = BuiltIn 5292
+
+pattern BuiltInFragmentSizeNV :: BuiltIn
+pattern BuiltInFragmentSizeNV = BuiltIn 5292
+
+pattern BuiltInFragInvocationCountEXT :: BuiltIn
+pattern BuiltInFragInvocationCountEXT = BuiltIn 5293
+
+pattern BuiltInInvocationsPerPixelNV :: BuiltIn
+pattern BuiltInInvocationsPerPixelNV = BuiltIn 5293
+
+pattern BuiltInLaunchIdKHR :: BuiltIn
+pattern BuiltInLaunchIdKHR = BuiltIn 5319
+
+pattern BuiltInLaunchIdNV :: BuiltIn
+pattern BuiltInLaunchIdNV = BuiltIn 5319
+
+pattern BuiltInLaunchSizeKHR :: BuiltIn
+pattern BuiltInLaunchSizeKHR = BuiltIn 5320
+
+pattern BuiltInLaunchSizeNV :: BuiltIn
+pattern BuiltInLaunchSizeNV = BuiltIn 5320
+
+pattern BuiltInWorldRayOriginKHR :: BuiltIn
+pattern BuiltInWorldRayOriginKHR = BuiltIn 5321
+
+pattern BuiltInWorldRayOriginNV :: BuiltIn
+pattern BuiltInWorldRayOriginNV = BuiltIn 5321
+
+pattern BuiltInWorldRayDirectionKHR :: BuiltIn
+pattern BuiltInWorldRayDirectionKHR = BuiltIn 5322
+
+pattern BuiltInWorldRayDirectionNV :: BuiltIn
+pattern BuiltInWorldRayDirectionNV = BuiltIn 5322
+
+pattern BuiltInObjectRayOriginKHR :: BuiltIn
+pattern BuiltInObjectRayOriginKHR = BuiltIn 5323
+
+pattern BuiltInObjectRayOriginNV :: BuiltIn
+pattern BuiltInObjectRayOriginNV = BuiltIn 5323
+
+pattern BuiltInObjectRayDirectionKHR :: BuiltIn
+pattern BuiltInObjectRayDirectionKHR = BuiltIn 5324
+
+pattern BuiltInObjectRayDirectionNV :: BuiltIn
+pattern BuiltInObjectRayDirectionNV = BuiltIn 5324
+
+pattern BuiltInRayTminKHR :: BuiltIn
+pattern BuiltInRayTminKHR = BuiltIn 5325
+
+pattern BuiltInRayTminNV :: BuiltIn
+pattern BuiltInRayTminNV = BuiltIn 5325
+
+pattern BuiltInRayTmaxKHR :: BuiltIn
+pattern BuiltInRayTmaxKHR = BuiltIn 5326
+
+pattern BuiltInRayTmaxNV :: BuiltIn
+pattern BuiltInRayTmaxNV = BuiltIn 5326
+
+pattern BuiltInInstanceCustomIndexKHR :: BuiltIn
+pattern BuiltInInstanceCustomIndexKHR = BuiltIn 5327
+
+pattern BuiltInInstanceCustomIndexNV :: BuiltIn
+pattern BuiltInInstanceCustomIndexNV = BuiltIn 5327
+
+pattern BuiltInObjectToWorldKHR :: BuiltIn
+pattern BuiltInObjectToWorldKHR = BuiltIn 5330
+
+pattern BuiltInObjectToWorldNV :: BuiltIn
+pattern BuiltInObjectToWorldNV = BuiltIn 5330
+
+pattern BuiltInWorldToObjectKHR :: BuiltIn
+pattern BuiltInWorldToObjectKHR = BuiltIn 5331
+
+pattern BuiltInWorldToObjectNV :: BuiltIn
+pattern BuiltInWorldToObjectNV = BuiltIn 5331
+
+pattern BuiltInHitTNV :: BuiltIn
+pattern BuiltInHitTNV = BuiltIn 5332
+
+pattern BuiltInHitKindKHR :: BuiltIn
+pattern BuiltInHitKindKHR = BuiltIn 5333
+
+pattern BuiltInHitKindNV :: BuiltIn
+pattern BuiltInHitKindNV = BuiltIn 5333
+
+pattern BuiltInCurrentRayTimeNV :: BuiltIn
+pattern BuiltInCurrentRayTimeNV = BuiltIn 5334
+
+pattern BuiltInIncomingRayFlagsKHR :: BuiltIn
+pattern BuiltInIncomingRayFlagsKHR = BuiltIn 5351
+
+pattern BuiltInIncomingRayFlagsNV :: BuiltIn
+pattern BuiltInIncomingRayFlagsNV = BuiltIn 5351
+
+pattern BuiltInRayGeometryIndexKHR :: BuiltIn
+pattern BuiltInRayGeometryIndexKHR = BuiltIn 5352
+
+pattern BuiltInWarpsPerSMNV :: BuiltIn
+pattern BuiltInWarpsPerSMNV = BuiltIn 5374
+
+pattern BuiltInSMCountNV :: BuiltIn
+pattern BuiltInSMCountNV = BuiltIn 5375
+
+pattern BuiltInWarpIDNV :: BuiltIn
+pattern BuiltInWarpIDNV = BuiltIn 5376
+
+pattern BuiltInSMIDNV :: BuiltIn
+pattern BuiltInSMIDNV = BuiltIn 5377
+
+pattern BuiltInCullMaskKHR :: BuiltIn
+pattern BuiltInCullMaskKHR = BuiltIn 6021
+
+pattern BuiltInMax :: BuiltIn
+pattern BuiltInMax = BuiltIn 0x7fffffff
diff --git a/lib/Data/SpirV/Reflect/Enums/SpirvDim.hs b/lib/Data/SpirV/Reflect/Enums/SpirvDim.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/SpirV/Reflect/Enums/SpirvDim.hs
@@ -0,0 +1,30 @@
+module Data.SpirV.Reflect.Enums.SpirvDim where
+
+import Data.SpirV.Reflect.Enums.Common
+
+newtype Dim = Dim Int32
+  deriving newtype (Eq, Ord, Show, Enum, Bounded)
+
+pattern Dim1D :: Dim
+pattern Dim1D = Dim 0
+
+pattern Dim2D :: Dim
+pattern Dim2D = Dim 1
+
+pattern Dim3D :: Dim
+pattern Dim3D = Dim 2
+
+pattern DimCube :: Dim
+pattern DimCube = Dim 3
+
+pattern DimRect :: Dim
+pattern DimRect = Dim 4
+
+pattern DimBuffer :: Dim
+pattern DimBuffer = Dim 5
+
+pattern DimSubpassData :: Dim
+pattern DimSubpassData = Dim 6
+
+pattern DimMax :: Dim
+pattern DimMax = Dim 0x7fffffff
diff --git a/lib/Data/SpirV/Reflect/Enums/SpirvImageFormat.hs b/lib/Data/SpirV/Reflect/Enums/SpirvImageFormat.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/SpirV/Reflect/Enums/SpirvImageFormat.hs
@@ -0,0 +1,135 @@
+module Data.SpirV.Reflect.Enums.SpirvImageFormat where
+
+import Data.SpirV.Reflect.Enums.Common
+
+newtype ImageFormat = ImageFormat Int32
+  deriving newtype (Eq, Ord, Show, Enum, Bounded)
+
+pattern ImageFormatUnknown :: ImageFormat
+pattern ImageFormatUnknown = ImageFormat 0
+
+pattern ImageFormatRgba32f :: ImageFormat
+pattern ImageFormatRgba32f = ImageFormat 1
+
+pattern ImageFormatRgba16f :: ImageFormat
+pattern ImageFormatRgba16f = ImageFormat 2
+
+pattern ImageFormatR32f :: ImageFormat
+pattern ImageFormatR32f = ImageFormat 3
+
+pattern ImageFormatRgba8 :: ImageFormat
+pattern ImageFormatRgba8 = ImageFormat 4
+
+pattern ImageFormatRgba8Snorm :: ImageFormat
+pattern ImageFormatRgba8Snorm = ImageFormat 5
+
+pattern ImageFormatRg32f :: ImageFormat
+pattern ImageFormatRg32f = ImageFormat 6
+
+pattern ImageFormatRg16f :: ImageFormat
+pattern ImageFormatRg16f = ImageFormat 7
+
+pattern ImageFormatR11fG11fB10f :: ImageFormat
+pattern ImageFormatR11fG11fB10f = ImageFormat 8
+
+pattern ImageFormatR16f :: ImageFormat
+pattern ImageFormatR16f = ImageFormat 9
+
+pattern ImageFormatRgba16 :: ImageFormat
+pattern ImageFormatRgba16 = ImageFormat 10
+
+pattern ImageFormatRgb10A2 :: ImageFormat
+pattern ImageFormatRgb10A2 = ImageFormat 11
+
+pattern ImageFormatRg16 :: ImageFormat
+pattern ImageFormatRg16 = ImageFormat 12
+
+pattern ImageFormatRg8 :: ImageFormat
+pattern ImageFormatRg8 = ImageFormat 13
+
+pattern ImageFormatR16 :: ImageFormat
+pattern ImageFormatR16 = ImageFormat 14
+
+pattern ImageFormatR8 :: ImageFormat
+pattern ImageFormatR8 = ImageFormat 15
+
+pattern ImageFormatRgba16Snorm :: ImageFormat
+pattern ImageFormatRgba16Snorm = ImageFormat 16
+
+pattern ImageFormatRg16Snorm :: ImageFormat
+pattern ImageFormatRg16Snorm = ImageFormat 17
+
+pattern ImageFormatRg8Snorm :: ImageFormat
+pattern ImageFormatRg8Snorm = ImageFormat 18
+
+pattern ImageFormatR16Snorm :: ImageFormat
+pattern ImageFormatR16Snorm = ImageFormat 19
+
+pattern ImageFormatR8Snorm :: ImageFormat
+pattern ImageFormatR8Snorm = ImageFormat 20
+
+pattern ImageFormatRgba32i :: ImageFormat
+pattern ImageFormatRgba32i = ImageFormat 21
+
+pattern ImageFormatRgba16i :: ImageFormat
+pattern ImageFormatRgba16i = ImageFormat 22
+
+pattern ImageFormatRgba8i :: ImageFormat
+pattern ImageFormatRgba8i = ImageFormat 23
+
+pattern ImageFormatR32i :: ImageFormat
+pattern ImageFormatR32i = ImageFormat 24
+
+pattern ImageFormatRg32i :: ImageFormat
+pattern ImageFormatRg32i = ImageFormat 25
+
+pattern ImageFormatRg16i :: ImageFormat
+pattern ImageFormatRg16i = ImageFormat 26
+
+pattern ImageFormatRg8i :: ImageFormat
+pattern ImageFormatRg8i = ImageFormat 27
+
+pattern ImageFormatR16i :: ImageFormat
+pattern ImageFormatR16i = ImageFormat 28
+
+pattern ImageFormatR8i :: ImageFormat
+pattern ImageFormatR8i = ImageFormat 29
+
+pattern ImageFormatRgba32ui :: ImageFormat
+pattern ImageFormatRgba32ui = ImageFormat 30
+
+pattern ImageFormatRgba16ui :: ImageFormat
+pattern ImageFormatRgba16ui = ImageFormat 31
+
+pattern ImageFormatRgba8ui :: ImageFormat
+pattern ImageFormatRgba8ui = ImageFormat 32
+
+pattern ImageFormatR32ui :: ImageFormat
+pattern ImageFormatR32ui = ImageFormat 33
+
+pattern ImageFormatRgb10a2ui :: ImageFormat
+pattern ImageFormatRgb10a2ui = ImageFormat 34
+
+pattern ImageFormatRg32ui :: ImageFormat
+pattern ImageFormatRg32ui = ImageFormat 35
+
+pattern ImageFormatRg16ui :: ImageFormat
+pattern ImageFormatRg16ui = ImageFormat 36
+
+pattern ImageFormatRg8ui :: ImageFormat
+pattern ImageFormatRg8ui = ImageFormat 37
+
+pattern ImageFormatR16ui :: ImageFormat
+pattern ImageFormatR16ui = ImageFormat 38
+
+pattern ImageFormatR8ui :: ImageFormat
+pattern ImageFormatR8ui = ImageFormat 39
+
+pattern ImageFormatR64ui :: ImageFormat
+pattern ImageFormatR64ui = ImageFormat 40
+
+pattern ImageFormatR64i :: ImageFormat
+pattern ImageFormatR64i = ImageFormat 41
+
+pattern ImageFormatMax :: ImageFormat
+pattern ImageFormatMax = ImageFormat 0x7fffffff
diff --git a/lib/Data/SpirV/Reflect/Enums/SpirvOp.hs b/lib/Data/SpirV/Reflect/Enums/SpirvOp.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/SpirV/Reflect/Enums/SpirvOp.hs
@@ -0,0 +1,2013 @@
+module Data.SpirV.Reflect.Enums.SpirvOp where
+
+import Data.SpirV.Reflect.Enums.Common
+
+newtype Op = Op Int32
+  deriving newtype (Eq, Ord, Show, Enum, Bounded)
+
+pattern OpNop :: Op
+pattern OpNop = Op 0
+
+pattern OpUndef :: Op
+pattern OpUndef = Op 1
+
+pattern OpSourceContinued :: Op
+pattern OpSourceContinued = Op 2
+
+pattern OpSource :: Op
+pattern OpSource = Op 3
+
+pattern OpSourceExtension :: Op
+pattern OpSourceExtension = Op 4
+
+pattern OpName :: Op
+pattern OpName = Op 5
+
+pattern OpMemberName :: Op
+pattern OpMemberName = Op 6
+
+pattern OpString :: Op
+pattern OpString = Op 7
+
+pattern OpLine :: Op
+pattern OpLine = Op 8
+
+pattern OpExtension :: Op
+pattern OpExtension = Op 10
+
+pattern OpExtInstImport :: Op
+pattern OpExtInstImport = Op 11
+
+pattern OpExtInst :: Op
+pattern OpExtInst = Op 12
+
+pattern OpMemoryModel :: Op
+pattern OpMemoryModel = Op 14
+
+pattern OpEntryPoint :: Op
+pattern OpEntryPoint = Op 15
+
+pattern OpExecutionMode :: Op
+pattern OpExecutionMode = Op 16
+
+pattern OpCapability :: Op
+pattern OpCapability = Op 17
+
+pattern OpTypeVoid :: Op
+pattern OpTypeVoid = Op 19
+
+pattern OpTypeBool :: Op
+pattern OpTypeBool = Op 20
+
+pattern OpTypeInt :: Op
+pattern OpTypeInt = Op 21
+
+pattern OpTypeFloat :: Op
+pattern OpTypeFloat = Op 22
+
+pattern OpTypeVector :: Op
+pattern OpTypeVector = Op 23
+
+pattern OpTypeMatrix :: Op
+pattern OpTypeMatrix = Op 24
+
+pattern OpTypeImage :: Op
+pattern OpTypeImage = Op 25
+
+pattern OpTypeSampler :: Op
+pattern OpTypeSampler = Op 26
+
+pattern OpTypeSampledImage :: Op
+pattern OpTypeSampledImage = Op 27
+
+pattern OpTypeArray :: Op
+pattern OpTypeArray = Op 28
+
+pattern OpTypeRuntimeArray :: Op
+pattern OpTypeRuntimeArray = Op 29
+
+pattern OpTypeStruct :: Op
+pattern OpTypeStruct = Op 30
+
+pattern OpTypeOpaque :: Op
+pattern OpTypeOpaque = Op 31
+
+pattern OpTypePointer :: Op
+pattern OpTypePointer = Op 32
+
+pattern OpTypeFunction :: Op
+pattern OpTypeFunction = Op 33
+
+pattern OpTypeEvent :: Op
+pattern OpTypeEvent = Op 34
+
+pattern OpTypeDeviceEvent :: Op
+pattern OpTypeDeviceEvent = Op 35
+
+pattern OpTypeReserveId :: Op
+pattern OpTypeReserveId = Op 36
+
+pattern OpTypeQueue :: Op
+pattern OpTypeQueue = Op 37
+
+pattern OpTypePipe :: Op
+pattern OpTypePipe = Op 38
+
+pattern OpTypeForwardPointer :: Op
+pattern OpTypeForwardPointer = Op 39
+
+pattern OpConstantTrue :: Op
+pattern OpConstantTrue = Op 41
+
+pattern OpConstantFalse :: Op
+pattern OpConstantFalse = Op 42
+
+pattern OpConstant :: Op
+pattern OpConstant = Op 43
+
+pattern OpConstantComposite :: Op
+pattern OpConstantComposite = Op 44
+
+pattern OpConstantSampler :: Op
+pattern OpConstantSampler = Op 45
+
+pattern OpConstantNull :: Op
+pattern OpConstantNull = Op 46
+
+pattern OpSpecConstantTrue :: Op
+pattern OpSpecConstantTrue = Op 48
+
+pattern OpSpecConstantFalse :: Op
+pattern OpSpecConstantFalse = Op 49
+
+pattern OpSpecConstant :: Op
+pattern OpSpecConstant = Op 50
+
+pattern OpSpecConstantComposite :: Op
+pattern OpSpecConstantComposite = Op 51
+
+pattern OpSpecConstantOp :: Op
+pattern OpSpecConstantOp = Op 52
+
+pattern OpFunction :: Op
+pattern OpFunction = Op 54
+
+pattern OpFunctionParameter :: Op
+pattern OpFunctionParameter = Op 55
+
+pattern OpFunctionEnd :: Op
+pattern OpFunctionEnd = Op 56
+
+pattern OpFunctionCall :: Op
+pattern OpFunctionCall = Op 57
+
+pattern OpVariable :: Op
+pattern OpVariable = Op 59
+
+pattern OpImageTexelPointer :: Op
+pattern OpImageTexelPointer = Op 60
+
+pattern OpLoad :: Op
+pattern OpLoad = Op 61
+
+pattern OpStore :: Op
+pattern OpStore = Op 62
+
+pattern OpCopyMemory :: Op
+pattern OpCopyMemory = Op 63
+
+pattern OpCopyMemorySized :: Op
+pattern OpCopyMemorySized = Op 64
+
+pattern OpAccessChain :: Op
+pattern OpAccessChain = Op 65
+
+pattern OpInBoundsAccessChain :: Op
+pattern OpInBoundsAccessChain = Op 66
+
+pattern OpPtrAccessChain :: Op
+pattern OpPtrAccessChain = Op 67
+
+pattern OpArrayLength :: Op
+pattern OpArrayLength = Op 68
+
+pattern OpGenericPtrMemSemantics :: Op
+pattern OpGenericPtrMemSemantics = Op 69
+
+pattern OpInBoundsPtrAccessChain :: Op
+pattern OpInBoundsPtrAccessChain = Op 70
+
+pattern OpDecorate :: Op
+pattern OpDecorate = Op 71
+
+pattern OpMemberDecorate :: Op
+pattern OpMemberDecorate = Op 72
+
+pattern OpDecorationGroup :: Op
+pattern OpDecorationGroup = Op 73
+
+pattern OpGroupDecorate :: Op
+pattern OpGroupDecorate = Op 74
+
+pattern OpGroupMemberDecorate :: Op
+pattern OpGroupMemberDecorate = Op 75
+
+pattern OpVectorExtractDynamic :: Op
+pattern OpVectorExtractDynamic = Op 77
+
+pattern OpVectorInsertDynamic :: Op
+pattern OpVectorInsertDynamic = Op 78
+
+pattern OpVectorShuffle :: Op
+pattern OpVectorShuffle = Op 79
+
+pattern OpCompositeConstruct :: Op
+pattern OpCompositeConstruct = Op 80
+
+pattern OpCompositeExtract :: Op
+pattern OpCompositeExtract = Op 81
+
+pattern OpCompositeInsert :: Op
+pattern OpCompositeInsert = Op 82
+
+pattern OpCopyObject :: Op
+pattern OpCopyObject = Op 83
+
+pattern OpTranspose :: Op
+pattern OpTranspose = Op 84
+
+pattern OpSampledImage :: Op
+pattern OpSampledImage = Op 86
+
+pattern OpImageSampleImplicitLod :: Op
+pattern OpImageSampleImplicitLod = Op 87
+
+pattern OpImageSampleExplicitLod :: Op
+pattern OpImageSampleExplicitLod = Op 88
+
+pattern OpImageSampleDrefImplicitLod :: Op
+pattern OpImageSampleDrefImplicitLod = Op 89
+
+pattern OpImageSampleDrefExplicitLod :: Op
+pattern OpImageSampleDrefExplicitLod = Op 90
+
+pattern OpImageSampleProjImplicitLod :: Op
+pattern OpImageSampleProjImplicitLod = Op 91
+
+pattern OpImageSampleProjExplicitLod :: Op
+pattern OpImageSampleProjExplicitLod = Op 92
+
+pattern OpImageSampleProjDrefImplicitLod :: Op
+pattern OpImageSampleProjDrefImplicitLod = Op 93
+
+pattern OpImageSampleProjDrefExplicitLod :: Op
+pattern OpImageSampleProjDrefExplicitLod = Op 94
+
+pattern OpImageFetch :: Op
+pattern OpImageFetch = Op 95
+
+pattern OpImageGather :: Op
+pattern OpImageGather = Op 96
+
+pattern OpImageDrefGather :: Op
+pattern OpImageDrefGather = Op 97
+
+pattern OpImageRead :: Op
+pattern OpImageRead = Op 98
+
+pattern OpImageWrite :: Op
+pattern OpImageWrite = Op 99
+
+pattern OpImage :: Op
+pattern OpImage = Op 100
+
+pattern OpImageQueryFormat :: Op
+pattern OpImageQueryFormat = Op 101
+
+pattern OpImageQueryOrder :: Op
+pattern OpImageQueryOrder = Op 102
+
+pattern OpImageQuerySizeLod :: Op
+pattern OpImageQuerySizeLod = Op 103
+
+pattern OpImageQuerySize :: Op
+pattern OpImageQuerySize = Op 104
+
+pattern OpImageQueryLod :: Op
+pattern OpImageQueryLod = Op 105
+
+pattern OpImageQueryLevels :: Op
+pattern OpImageQueryLevels = Op 106
+
+pattern OpImageQuerySamples :: Op
+pattern OpImageQuerySamples = Op 107
+
+pattern OpConvertFToU :: Op
+pattern OpConvertFToU = Op 109
+
+pattern OpConvertFToS :: Op
+pattern OpConvertFToS = Op 110
+
+pattern OpConvertSToF :: Op
+pattern OpConvertSToF = Op 111
+
+pattern OpConvertUToF :: Op
+pattern OpConvertUToF = Op 112
+
+pattern OpUConvert :: Op
+pattern OpUConvert = Op 113
+
+pattern OpSConvert :: Op
+pattern OpSConvert = Op 114
+
+pattern OpFConvert :: Op
+pattern OpFConvert = Op 115
+
+pattern OpQuantizeToF16 :: Op
+pattern OpQuantizeToF16 = Op 116
+
+pattern OpConvertPtrToU :: Op
+pattern OpConvertPtrToU = Op 117
+
+pattern OpSatConvertSToU :: Op
+pattern OpSatConvertSToU = Op 118
+
+pattern OpSatConvertUToS :: Op
+pattern OpSatConvertUToS = Op 119
+
+pattern OpConvertUToPtr :: Op
+pattern OpConvertUToPtr = Op 120
+
+pattern OpPtrCastToGeneric :: Op
+pattern OpPtrCastToGeneric = Op 121
+
+pattern OpGenericCastToPtr :: Op
+pattern OpGenericCastToPtr = Op 122
+
+pattern OpGenericCastToPtrExplicit :: Op
+pattern OpGenericCastToPtrExplicit = Op 123
+
+pattern OpBitcast :: Op
+pattern OpBitcast = Op 124
+
+pattern OpSNegate :: Op
+pattern OpSNegate = Op 126
+
+pattern OpFNegate :: Op
+pattern OpFNegate = Op 127
+
+pattern OpIAdd :: Op
+pattern OpIAdd = Op 128
+
+pattern OpFAdd :: Op
+pattern OpFAdd = Op 129
+
+pattern OpISub :: Op
+pattern OpISub = Op 130
+
+pattern OpFSub :: Op
+pattern OpFSub = Op 131
+
+pattern OpIMul :: Op
+pattern OpIMul = Op 132
+
+pattern OpFMul :: Op
+pattern OpFMul = Op 133
+
+pattern OpUDiv :: Op
+pattern OpUDiv = Op 134
+
+pattern OpSDiv :: Op
+pattern OpSDiv = Op 135
+
+pattern OpFDiv :: Op
+pattern OpFDiv = Op 136
+
+pattern OpUMod :: Op
+pattern OpUMod = Op 137
+
+pattern OpSRem :: Op
+pattern OpSRem = Op 138
+
+pattern OpSMod :: Op
+pattern OpSMod = Op 139
+
+pattern OpFRem :: Op
+pattern OpFRem = Op 140
+
+pattern OpFMod :: Op
+pattern OpFMod = Op 141
+
+pattern OpVectorTimesScalar :: Op
+pattern OpVectorTimesScalar = Op 142
+
+pattern OpMatrixTimesScalar :: Op
+pattern OpMatrixTimesScalar = Op 143
+
+pattern OpVectorTimesMatrix :: Op
+pattern OpVectorTimesMatrix = Op 144
+
+pattern OpMatrixTimesVector :: Op
+pattern OpMatrixTimesVector = Op 145
+
+pattern OpMatrixTimesMatrix :: Op
+pattern OpMatrixTimesMatrix = Op 146
+
+pattern OpOuterProduct :: Op
+pattern OpOuterProduct = Op 147
+
+pattern OpDot :: Op
+pattern OpDot = Op 148
+
+pattern OpIAddCarry :: Op
+pattern OpIAddCarry = Op 149
+
+pattern OpISubBorrow :: Op
+pattern OpISubBorrow = Op 150
+
+pattern OpUMulExtended :: Op
+pattern OpUMulExtended = Op 151
+
+pattern OpSMulExtended :: Op
+pattern OpSMulExtended = Op 152
+
+pattern OpAny :: Op
+pattern OpAny = Op 154
+
+pattern OpAll :: Op
+pattern OpAll = Op 155
+
+pattern OpIsNan :: Op
+pattern OpIsNan = Op 156
+
+pattern OpIsInf :: Op
+pattern OpIsInf = Op 157
+
+pattern OpIsFinite :: Op
+pattern OpIsFinite = Op 158
+
+pattern OpIsNormal :: Op
+pattern OpIsNormal = Op 159
+
+pattern OpSignBitSet :: Op
+pattern OpSignBitSet = Op 160
+
+pattern OpLessOrGreater :: Op
+pattern OpLessOrGreater = Op 161
+
+pattern OpOrdered :: Op
+pattern OpOrdered = Op 162
+
+pattern OpUnordered :: Op
+pattern OpUnordered = Op 163
+
+pattern OpLogicalEqual :: Op
+pattern OpLogicalEqual = Op 164
+
+pattern OpLogicalNotEqual :: Op
+pattern OpLogicalNotEqual = Op 165
+
+pattern OpLogicalOr :: Op
+pattern OpLogicalOr = Op 166
+
+pattern OpLogicalAnd :: Op
+pattern OpLogicalAnd = Op 167
+
+pattern OpLogicalNot :: Op
+pattern OpLogicalNot = Op 168
+
+pattern OpSelect :: Op
+pattern OpSelect = Op 169
+
+pattern OpIEqual :: Op
+pattern OpIEqual = Op 170
+
+pattern OpINotEqual :: Op
+pattern OpINotEqual = Op 171
+
+pattern OpUGreaterThan :: Op
+pattern OpUGreaterThan = Op 172
+
+pattern OpSGreaterThan :: Op
+pattern OpSGreaterThan = Op 173
+
+pattern OpUGreaterThanEqual :: Op
+pattern OpUGreaterThanEqual = Op 174
+
+pattern OpSGreaterThanEqual :: Op
+pattern OpSGreaterThanEqual = Op 175
+
+pattern OpULessThan :: Op
+pattern OpULessThan = Op 176
+
+pattern OpSLessThan :: Op
+pattern OpSLessThan = Op 177
+
+pattern OpULessThanEqual :: Op
+pattern OpULessThanEqual = Op 178
+
+pattern OpSLessThanEqual :: Op
+pattern OpSLessThanEqual = Op 179
+
+pattern OpFOrdEqual :: Op
+pattern OpFOrdEqual = Op 180
+
+pattern OpFUnordEqual :: Op
+pattern OpFUnordEqual = Op 181
+
+pattern OpFOrdNotEqual :: Op
+pattern OpFOrdNotEqual = Op 182
+
+pattern OpFUnordNotEqual :: Op
+pattern OpFUnordNotEqual = Op 183
+
+pattern OpFOrdLessThan :: Op
+pattern OpFOrdLessThan = Op 184
+
+pattern OpFUnordLessThan :: Op
+pattern OpFUnordLessThan = Op 185
+
+pattern OpFOrdGreaterThan :: Op
+pattern OpFOrdGreaterThan = Op 186
+
+pattern OpFUnordGreaterThan :: Op
+pattern OpFUnordGreaterThan = Op 187
+
+pattern OpFOrdLessThanEqual :: Op
+pattern OpFOrdLessThanEqual = Op 188
+
+pattern OpFUnordLessThanEqual :: Op
+pattern OpFUnordLessThanEqual = Op 189
+
+pattern OpFOrdGreaterThanEqual :: Op
+pattern OpFOrdGreaterThanEqual = Op 190
+
+pattern OpFUnordGreaterThanEqual :: Op
+pattern OpFUnordGreaterThanEqual = Op 191
+
+pattern OpShiftRightLogical :: Op
+pattern OpShiftRightLogical = Op 194
+
+pattern OpShiftRightArithmetic :: Op
+pattern OpShiftRightArithmetic = Op 195
+
+pattern OpShiftLeftLogical :: Op
+pattern OpShiftLeftLogical = Op 196
+
+pattern OpBitwiseOr :: Op
+pattern OpBitwiseOr = Op 197
+
+pattern OpBitwiseXor :: Op
+pattern OpBitwiseXor = Op 198
+
+pattern OpBitwiseAnd :: Op
+pattern OpBitwiseAnd = Op 199
+
+pattern OpNot :: Op
+pattern OpNot = Op 200
+
+pattern OpBitFieldInsert :: Op
+pattern OpBitFieldInsert = Op 201
+
+pattern OpBitFieldSExtract :: Op
+pattern OpBitFieldSExtract = Op 202
+
+pattern OpBitFieldUExtract :: Op
+pattern OpBitFieldUExtract = Op 203
+
+pattern OpBitReverse :: Op
+pattern OpBitReverse = Op 204
+
+pattern OpBitCount :: Op
+pattern OpBitCount = Op 205
+
+pattern OpDPdx :: Op
+pattern OpDPdx = Op 207
+
+pattern OpDPdy :: Op
+pattern OpDPdy = Op 208
+
+pattern OpFwidth :: Op
+pattern OpFwidth = Op 209
+
+pattern OpDPdxFine :: Op
+pattern OpDPdxFine = Op 210
+
+pattern OpDPdyFine :: Op
+pattern OpDPdyFine = Op 211
+
+pattern OpFwidthFine :: Op
+pattern OpFwidthFine = Op 212
+
+pattern OpDPdxCoarse :: Op
+pattern OpDPdxCoarse = Op 213
+
+pattern OpDPdyCoarse :: Op
+pattern OpDPdyCoarse = Op 214
+
+pattern OpFwidthCoarse :: Op
+pattern OpFwidthCoarse = Op 215
+
+pattern OpEmitVertex :: Op
+pattern OpEmitVertex = Op 218
+
+pattern OpEndPrimitive :: Op
+pattern OpEndPrimitive = Op 219
+
+pattern OpEmitStreamVertex :: Op
+pattern OpEmitStreamVertex = Op 220
+
+pattern OpEndStreamPrimitive :: Op
+pattern OpEndStreamPrimitive = Op 221
+
+pattern OpControlBarrier :: Op
+pattern OpControlBarrier = Op 224
+
+pattern OpMemoryBarrier :: Op
+pattern OpMemoryBarrier = Op 225
+
+pattern OpAtomicLoad :: Op
+pattern OpAtomicLoad = Op 227
+
+pattern OpAtomicStore :: Op
+pattern OpAtomicStore = Op 228
+
+pattern OpAtomicExchange :: Op
+pattern OpAtomicExchange = Op 229
+
+pattern OpAtomicCompareExchange :: Op
+pattern OpAtomicCompareExchange = Op 230
+
+pattern OpAtomicCompareExchangeWeak :: Op
+pattern OpAtomicCompareExchangeWeak = Op 231
+
+pattern OpAtomicIIncrement :: Op
+pattern OpAtomicIIncrement = Op 232
+
+pattern OpAtomicIDecrement :: Op
+pattern OpAtomicIDecrement = Op 233
+
+pattern OpAtomicIAdd :: Op
+pattern OpAtomicIAdd = Op 234
+
+pattern OpAtomicISub :: Op
+pattern OpAtomicISub = Op 235
+
+pattern OpAtomicSMin :: Op
+pattern OpAtomicSMin = Op 236
+
+pattern OpAtomicUMin :: Op
+pattern OpAtomicUMin = Op 237
+
+pattern OpAtomicSMax :: Op
+pattern OpAtomicSMax = Op 238
+
+pattern OpAtomicUMax :: Op
+pattern OpAtomicUMax = Op 239
+
+pattern OpAtomicAnd :: Op
+pattern OpAtomicAnd = Op 240
+
+pattern OpAtomicOr :: Op
+pattern OpAtomicOr = Op 241
+
+pattern OpAtomicXor :: Op
+pattern OpAtomicXor = Op 242
+
+pattern OpPhi :: Op
+pattern OpPhi = Op 245
+
+pattern OpLoopMerge :: Op
+pattern OpLoopMerge = Op 246
+
+pattern OpSelectionMerge :: Op
+pattern OpSelectionMerge = Op 247
+
+pattern OpLabel :: Op
+pattern OpLabel = Op 248
+
+pattern OpBranch :: Op
+pattern OpBranch = Op 249
+
+pattern OpBranchConditional :: Op
+pattern OpBranchConditional = Op 250
+
+pattern OpSwitch :: Op
+pattern OpSwitch = Op 251
+
+pattern OpKill :: Op
+pattern OpKill = Op 252
+
+pattern OpReturn :: Op
+pattern OpReturn = Op 253
+
+pattern OpReturnValue :: Op
+pattern OpReturnValue = Op 254
+
+pattern OpUnreachable :: Op
+pattern OpUnreachable = Op 255
+
+pattern OpLifetimeStart :: Op
+pattern OpLifetimeStart = Op 256
+
+pattern OpLifetimeStop :: Op
+pattern OpLifetimeStop = Op 257
+
+pattern OpGroupAsyncCopy :: Op
+pattern OpGroupAsyncCopy = Op 259
+
+pattern OpGroupWaitEvents :: Op
+pattern OpGroupWaitEvents = Op 260
+
+pattern OpGroupAll :: Op
+pattern OpGroupAll = Op 261
+
+pattern OpGroupAny :: Op
+pattern OpGroupAny = Op 262
+
+pattern OpGroupBroadcast :: Op
+pattern OpGroupBroadcast = Op 263
+
+pattern OpGroupIAdd :: Op
+pattern OpGroupIAdd = Op 264
+
+pattern OpGroupFAdd :: Op
+pattern OpGroupFAdd = Op 265
+
+pattern OpGroupFMin :: Op
+pattern OpGroupFMin = Op 266
+
+pattern OpGroupUMin :: Op
+pattern OpGroupUMin = Op 267
+
+pattern OpGroupSMin :: Op
+pattern OpGroupSMin = Op 268
+
+pattern OpGroupFMax :: Op
+pattern OpGroupFMax = Op 269
+
+pattern OpGroupUMax :: Op
+pattern OpGroupUMax = Op 270
+
+pattern OpGroupSMax :: Op
+pattern OpGroupSMax = Op 271
+
+pattern OpReadPipe :: Op
+pattern OpReadPipe = Op 274
+
+pattern OpWritePipe :: Op
+pattern OpWritePipe = Op 275
+
+pattern OpReservedReadPipe :: Op
+pattern OpReservedReadPipe = Op 276
+
+pattern OpReservedWritePipe :: Op
+pattern OpReservedWritePipe = Op 277
+
+pattern OpReserveReadPipePackets :: Op
+pattern OpReserveReadPipePackets = Op 278
+
+pattern OpReserveWritePipePackets :: Op
+pattern OpReserveWritePipePackets = Op 279
+
+pattern OpCommitReadPipe :: Op
+pattern OpCommitReadPipe = Op 280
+
+pattern OpCommitWritePipe :: Op
+pattern OpCommitWritePipe = Op 281
+
+pattern OpIsValidReserveId :: Op
+pattern OpIsValidReserveId = Op 282
+
+pattern OpGetNumPipePackets :: Op
+pattern OpGetNumPipePackets = Op 283
+
+pattern OpGetMaxPipePackets :: Op
+pattern OpGetMaxPipePackets = Op 284
+
+pattern OpGroupReserveReadPipePackets :: Op
+pattern OpGroupReserveReadPipePackets = Op 285
+
+pattern OpGroupReserveWritePipePackets :: Op
+pattern OpGroupReserveWritePipePackets = Op 286
+
+pattern OpGroupCommitReadPipe :: Op
+pattern OpGroupCommitReadPipe = Op 287
+
+pattern OpGroupCommitWritePipe :: Op
+pattern OpGroupCommitWritePipe = Op 288
+
+pattern OpEnqueueMarker :: Op
+pattern OpEnqueueMarker = Op 291
+
+pattern OpEnqueueKernel :: Op
+pattern OpEnqueueKernel = Op 292
+
+pattern OpGetKernelNDrangeSubGroupCount :: Op
+pattern OpGetKernelNDrangeSubGroupCount = Op 293
+
+pattern OpGetKernelNDrangeMaxSubGroupSize :: Op
+pattern OpGetKernelNDrangeMaxSubGroupSize = Op 294
+
+pattern OpGetKernelWorkGroupSize :: Op
+pattern OpGetKernelWorkGroupSize = Op 295
+
+pattern OpGetKernelPreferredWorkGroupSizeMultiple :: Op
+pattern OpGetKernelPreferredWorkGroupSizeMultiple = Op 296
+
+pattern OpRetainEvent :: Op
+pattern OpRetainEvent = Op 297
+
+pattern OpReleaseEvent :: Op
+pattern OpReleaseEvent = Op 298
+
+pattern OpCreateUserEvent :: Op
+pattern OpCreateUserEvent = Op 299
+
+pattern OpIsValidEvent :: Op
+pattern OpIsValidEvent = Op 300
+
+pattern OpSetUserEventStatus :: Op
+pattern OpSetUserEventStatus = Op 301
+
+pattern OpCaptureEventProfilingInfo :: Op
+pattern OpCaptureEventProfilingInfo = Op 302
+
+pattern OpGetDefaultQueue :: Op
+pattern OpGetDefaultQueue = Op 303
+
+pattern OpBuildNDRange :: Op
+pattern OpBuildNDRange = Op 304
+
+pattern OpImageSparseSampleImplicitLod :: Op
+pattern OpImageSparseSampleImplicitLod = Op 305
+
+pattern OpImageSparseSampleExplicitLod :: Op
+pattern OpImageSparseSampleExplicitLod = Op 306
+
+pattern OpImageSparseSampleDrefImplicitLod :: Op
+pattern OpImageSparseSampleDrefImplicitLod = Op 307
+
+pattern OpImageSparseSampleDrefExplicitLod :: Op
+pattern OpImageSparseSampleDrefExplicitLod = Op 308
+
+pattern OpImageSparseSampleProjImplicitLod :: Op
+pattern OpImageSparseSampleProjImplicitLod = Op 309
+
+pattern OpImageSparseSampleProjExplicitLod :: Op
+pattern OpImageSparseSampleProjExplicitLod = Op 310
+
+pattern OpImageSparseSampleProjDrefImplicitLod :: Op
+pattern OpImageSparseSampleProjDrefImplicitLod = Op 311
+
+pattern OpImageSparseSampleProjDrefExplicitLod :: Op
+pattern OpImageSparseSampleProjDrefExplicitLod = Op 312
+
+pattern OpImageSparseFetch :: Op
+pattern OpImageSparseFetch = Op 313
+
+pattern OpImageSparseGather :: Op
+pattern OpImageSparseGather = Op 314
+
+pattern OpImageSparseDrefGather :: Op
+pattern OpImageSparseDrefGather = Op 315
+
+pattern OpImageSparseTexelsResident :: Op
+pattern OpImageSparseTexelsResident = Op 316
+
+pattern OpNoLine :: Op
+pattern OpNoLine = Op 317
+
+pattern OpAtomicFlagTestAndSet :: Op
+pattern OpAtomicFlagTestAndSet = Op 318
+
+pattern OpAtomicFlagClear :: Op
+pattern OpAtomicFlagClear = Op 319
+
+pattern OpImageSparseRead :: Op
+pattern OpImageSparseRead = Op 320
+
+pattern OpSizeOf :: Op
+pattern OpSizeOf = Op 321
+
+pattern OpTypePipeStorage :: Op
+pattern OpTypePipeStorage = Op 322
+
+pattern OpConstantPipeStorage :: Op
+pattern OpConstantPipeStorage = Op 323
+
+pattern OpCreatePipeFromPipeStorage :: Op
+pattern OpCreatePipeFromPipeStorage = Op 324
+
+pattern OpGetKernelLocalSizeForSubgroupCount :: Op
+pattern OpGetKernelLocalSizeForSubgroupCount = Op 325
+
+pattern OpGetKernelMaxNumSubgroups :: Op
+pattern OpGetKernelMaxNumSubgroups = Op 326
+
+pattern OpTypeNamedBarrier :: Op
+pattern OpTypeNamedBarrier = Op 327
+
+pattern OpNamedBarrierInitialize :: Op
+pattern OpNamedBarrierInitialize = Op 328
+
+pattern OpMemoryNamedBarrier :: Op
+pattern OpMemoryNamedBarrier = Op 329
+
+pattern OpModuleProcessed :: Op
+pattern OpModuleProcessed = Op 330
+
+pattern OpExecutionModeId :: Op
+pattern OpExecutionModeId = Op 331
+
+pattern OpDecorateId :: Op
+pattern OpDecorateId = Op 332
+
+pattern OpGroupNonUniformElect :: Op
+pattern OpGroupNonUniformElect = Op 333
+
+pattern OpGroupNonUniformAll :: Op
+pattern OpGroupNonUniformAll = Op 334
+
+pattern OpGroupNonUniformAny :: Op
+pattern OpGroupNonUniformAny = Op 335
+
+pattern OpGroupNonUniformAllEqual :: Op
+pattern OpGroupNonUniformAllEqual = Op 336
+
+pattern OpGroupNonUniformBroadcast :: Op
+pattern OpGroupNonUniformBroadcast = Op 337
+
+pattern OpGroupNonUniformBroadcastFirst :: Op
+pattern OpGroupNonUniformBroadcastFirst = Op 338
+
+pattern OpGroupNonUniformBallot :: Op
+pattern OpGroupNonUniformBallot = Op 339
+
+pattern OpGroupNonUniformInverseBallot :: Op
+pattern OpGroupNonUniformInverseBallot = Op 340
+
+pattern OpGroupNonUniformBallotBitExtract :: Op
+pattern OpGroupNonUniformBallotBitExtract = Op 341
+
+pattern OpGroupNonUniformBallotBitCount :: Op
+pattern OpGroupNonUniformBallotBitCount = Op 342
+
+pattern OpGroupNonUniformBallotFindLSB :: Op
+pattern OpGroupNonUniformBallotFindLSB = Op 343
+
+pattern OpGroupNonUniformBallotFindMSB :: Op
+pattern OpGroupNonUniformBallotFindMSB = Op 344
+
+pattern OpGroupNonUniformShuffle :: Op
+pattern OpGroupNonUniformShuffle = Op 345
+
+pattern OpGroupNonUniformShuffleXor :: Op
+pattern OpGroupNonUniformShuffleXor = Op 346
+
+pattern OpGroupNonUniformShuffleUp :: Op
+pattern OpGroupNonUniformShuffleUp = Op 347
+
+pattern OpGroupNonUniformShuffleDown :: Op
+pattern OpGroupNonUniformShuffleDown = Op 348
+
+pattern OpGroupNonUniformIAdd :: Op
+pattern OpGroupNonUniformIAdd = Op 349
+
+pattern OpGroupNonUniformFAdd :: Op
+pattern OpGroupNonUniformFAdd = Op 350
+
+pattern OpGroupNonUniformIMul :: Op
+pattern OpGroupNonUniformIMul = Op 351
+
+pattern OpGroupNonUniformFMul :: Op
+pattern OpGroupNonUniformFMul = Op 352
+
+pattern OpGroupNonUniformSMin :: Op
+pattern OpGroupNonUniformSMin = Op 353
+
+pattern OpGroupNonUniformUMin :: Op
+pattern OpGroupNonUniformUMin = Op 354
+
+pattern OpGroupNonUniformFMin :: Op
+pattern OpGroupNonUniformFMin = Op 355
+
+pattern OpGroupNonUniformSMax :: Op
+pattern OpGroupNonUniformSMax = Op 356
+
+pattern OpGroupNonUniformUMax :: Op
+pattern OpGroupNonUniformUMax = Op 357
+
+pattern OpGroupNonUniformFMax :: Op
+pattern OpGroupNonUniformFMax = Op 358
+
+pattern OpGroupNonUniformBitwiseAnd :: Op
+pattern OpGroupNonUniformBitwiseAnd = Op 359
+
+pattern OpGroupNonUniformBitwiseOr :: Op
+pattern OpGroupNonUniformBitwiseOr = Op 360
+
+pattern OpGroupNonUniformBitwiseXor :: Op
+pattern OpGroupNonUniformBitwiseXor = Op 361
+
+pattern OpGroupNonUniformLogicalAnd :: Op
+pattern OpGroupNonUniformLogicalAnd = Op 362
+
+pattern OpGroupNonUniformLogicalOr :: Op
+pattern OpGroupNonUniformLogicalOr = Op 363
+
+pattern OpGroupNonUniformLogicalXor :: Op
+pattern OpGroupNonUniformLogicalXor = Op 364
+
+pattern OpGroupNonUniformQuadBroadcast :: Op
+pattern OpGroupNonUniformQuadBroadcast = Op 365
+
+pattern OpGroupNonUniformQuadSwap :: Op
+pattern OpGroupNonUniformQuadSwap = Op 366
+
+pattern OpCopyLogical :: Op
+pattern OpCopyLogical = Op 400
+
+pattern OpPtrEqual :: Op
+pattern OpPtrEqual = Op 401
+
+pattern OpPtrNotEqual :: Op
+pattern OpPtrNotEqual = Op 402
+
+pattern OpPtrDiff :: Op
+pattern OpPtrDiff = Op 403
+
+pattern OpTerminateInvocation :: Op
+pattern OpTerminateInvocation = Op 4416
+
+pattern OpSubgroupBallotKHR :: Op
+pattern OpSubgroupBallotKHR = Op 4421
+
+pattern OpSubgroupFirstInvocationKHR :: Op
+pattern OpSubgroupFirstInvocationKHR = Op 4422
+
+pattern OpSubgroupAllKHR :: Op
+pattern OpSubgroupAllKHR = Op 4428
+
+pattern OpSubgroupAnyKHR :: Op
+pattern OpSubgroupAnyKHR = Op 4429
+
+pattern OpSubgroupAllEqualKHR :: Op
+pattern OpSubgroupAllEqualKHR = Op 4430
+
+pattern OpGroupNonUniformRotateKHR :: Op
+pattern OpGroupNonUniformRotateKHR = Op 4431
+
+pattern OpSubgroupReadInvocationKHR :: Op
+pattern OpSubgroupReadInvocationKHR = Op 4432
+
+pattern OpTraceRayKHR :: Op
+pattern OpTraceRayKHR = Op 4445
+
+pattern OpExecuteCallableKHR :: Op
+pattern OpExecuteCallableKHR = Op 4446
+
+pattern OpConvertUToAccelerationStructureKHR :: Op
+pattern OpConvertUToAccelerationStructureKHR = Op 4447
+
+pattern OpIgnoreIntersectionKHR :: Op
+pattern OpIgnoreIntersectionKHR = Op 4448
+
+pattern OpTerminateRayKHR :: Op
+pattern OpTerminateRayKHR = Op 4449
+
+pattern OpSDot :: Op
+pattern OpSDot = Op 4450
+
+pattern OpSDotKHR :: Op
+pattern OpSDotKHR = Op 4450
+
+pattern OpUDot :: Op
+pattern OpUDot = Op 4451
+
+pattern OpUDotKHR :: Op
+pattern OpUDotKHR = Op 4451
+
+pattern OpSUDot :: Op
+pattern OpSUDot = Op 4452
+
+pattern OpSUDotKHR :: Op
+pattern OpSUDotKHR = Op 4452
+
+pattern OpSDotAccSat :: Op
+pattern OpSDotAccSat = Op 4453
+
+pattern OpSDotAccSatKHR :: Op
+pattern OpSDotAccSatKHR = Op 4453
+
+pattern OpUDotAccSat :: Op
+pattern OpUDotAccSat = Op 4454
+
+pattern OpUDotAccSatKHR :: Op
+pattern OpUDotAccSatKHR = Op 4454
+
+pattern OpSUDotAccSat :: Op
+pattern OpSUDotAccSat = Op 4455
+
+pattern OpSUDotAccSatKHR :: Op
+pattern OpSUDotAccSatKHR = Op 4455
+
+pattern OpTypeRayQueryKHR :: Op
+pattern OpTypeRayQueryKHR = Op 4472
+
+pattern OpRayQueryInitializeKHR :: Op
+pattern OpRayQueryInitializeKHR = Op 4473
+
+pattern OpRayQueryTerminateKHR :: Op
+pattern OpRayQueryTerminateKHR = Op 4474
+
+pattern OpRayQueryGenerateIntersectionKHR :: Op
+pattern OpRayQueryGenerateIntersectionKHR = Op 4475
+
+pattern OpRayQueryConfirmIntersectionKHR :: Op
+pattern OpRayQueryConfirmIntersectionKHR = Op 4476
+
+pattern OpRayQueryProceedKHR :: Op
+pattern OpRayQueryProceedKHR = Op 4477
+
+pattern OpRayQueryGetIntersectionTypeKHR :: Op
+pattern OpRayQueryGetIntersectionTypeKHR = Op 4479
+
+pattern OpGroupIAddNonUniformAMD :: Op
+pattern OpGroupIAddNonUniformAMD = Op 5000
+
+pattern OpGroupFAddNonUniformAMD :: Op
+pattern OpGroupFAddNonUniformAMD = Op 5001
+
+pattern OpGroupFMinNonUniformAMD :: Op
+pattern OpGroupFMinNonUniformAMD = Op 5002
+
+pattern OpGroupUMinNonUniformAMD :: Op
+pattern OpGroupUMinNonUniformAMD = Op 5003
+
+pattern OpGroupSMinNonUniformAMD :: Op
+pattern OpGroupSMinNonUniformAMD = Op 5004
+
+pattern OpGroupFMaxNonUniformAMD :: Op
+pattern OpGroupFMaxNonUniformAMD = Op 5005
+
+pattern OpGroupUMaxNonUniformAMD :: Op
+pattern OpGroupUMaxNonUniformAMD = Op 5006
+
+pattern OpGroupSMaxNonUniformAMD :: Op
+pattern OpGroupSMaxNonUniformAMD = Op 5007
+
+pattern OpFragmentMaskFetchAMD :: Op
+pattern OpFragmentMaskFetchAMD = Op 5011
+
+pattern OpFragmentFetchAMD :: Op
+pattern OpFragmentFetchAMD = Op 5012
+
+pattern OpReadClockKHR :: Op
+pattern OpReadClockKHR = Op 5056
+
+pattern OpImageSampleFootprintNV :: Op
+pattern OpImageSampleFootprintNV = Op 5283
+
+pattern OpGroupNonUniformPartitionNV :: Op
+pattern OpGroupNonUniformPartitionNV = Op 5296
+
+pattern OpWritePackedPrimitiveIndices4x8NV :: Op
+pattern OpWritePackedPrimitiveIndices4x8NV = Op 5299
+
+pattern OpReportIntersectionKHR :: Op
+pattern OpReportIntersectionKHR = Op 5334
+
+pattern OpReportIntersectionNV :: Op
+pattern OpReportIntersectionNV = Op 5334
+
+pattern OpIgnoreIntersectionNV :: Op
+pattern OpIgnoreIntersectionNV = Op 5335
+
+pattern OpTerminateRayNV :: Op
+pattern OpTerminateRayNV = Op 5336
+
+pattern OpTraceNV :: Op
+pattern OpTraceNV = Op 5337
+
+pattern OpTraceMotionNV :: Op
+pattern OpTraceMotionNV = Op 5338
+
+pattern OpTraceRayMotionNV :: Op
+pattern OpTraceRayMotionNV = Op 5339
+
+pattern OpTypeAccelerationStructureKHR :: Op
+pattern OpTypeAccelerationStructureKHR = Op 5341
+
+pattern OpTypeAccelerationStructureNV :: Op
+pattern OpTypeAccelerationStructureNV = Op 5341
+
+pattern OpExecuteCallableNV :: Op
+pattern OpExecuteCallableNV = Op 5344
+
+pattern OpTypeCooperativeMatrixNV :: Op
+pattern OpTypeCooperativeMatrixNV = Op 5358
+
+pattern OpCooperativeMatrixLoadNV :: Op
+pattern OpCooperativeMatrixLoadNV = Op 5359
+
+pattern OpCooperativeMatrixStoreNV :: Op
+pattern OpCooperativeMatrixStoreNV = Op 5360
+
+pattern OpCooperativeMatrixMulAddNV :: Op
+pattern OpCooperativeMatrixMulAddNV = Op 5361
+
+pattern OpCooperativeMatrixLengthNV :: Op
+pattern OpCooperativeMatrixLengthNV = Op 5362
+
+pattern OpBeginInvocationInterlockEXT :: Op
+pattern OpBeginInvocationInterlockEXT = Op 5364
+
+pattern OpEndInvocationInterlockEXT :: Op
+pattern OpEndInvocationInterlockEXT = Op 5365
+
+pattern OpDemoteToHelperInvocation :: Op
+pattern OpDemoteToHelperInvocation = Op 5380
+
+pattern OpDemoteToHelperInvocationEXT :: Op
+pattern OpDemoteToHelperInvocationEXT = Op 5380
+
+pattern OpIsHelperInvocationEXT :: Op
+pattern OpIsHelperInvocationEXT = Op 5381
+
+pattern OpConvertUToImageNV :: Op
+pattern OpConvertUToImageNV = Op 5391
+
+pattern OpConvertUToSamplerNV :: Op
+pattern OpConvertUToSamplerNV = Op 5392
+
+pattern OpConvertImageToUNV :: Op
+pattern OpConvertImageToUNV = Op 5393
+
+pattern OpConvertSamplerToUNV :: Op
+pattern OpConvertSamplerToUNV = Op 5394
+
+pattern OpConvertUToSampledImageNV :: Op
+pattern OpConvertUToSampledImageNV = Op 5395
+
+pattern OpConvertSampledImageToUNV :: Op
+pattern OpConvertSampledImageToUNV = Op 5396
+
+pattern OpSamplerImageAddressingModeNV :: Op
+pattern OpSamplerImageAddressingModeNV = Op 5397
+
+pattern OpSubgroupShuffleINTEL :: Op
+pattern OpSubgroupShuffleINTEL = Op 5571
+
+pattern OpSubgroupShuffleDownINTEL :: Op
+pattern OpSubgroupShuffleDownINTEL = Op 5572
+
+pattern OpSubgroupShuffleUpINTEL :: Op
+pattern OpSubgroupShuffleUpINTEL = Op 5573
+
+pattern OpSubgroupShuffleXorINTEL :: Op
+pattern OpSubgroupShuffleXorINTEL = Op 5574
+
+pattern OpSubgroupBlockReadINTEL :: Op
+pattern OpSubgroupBlockReadINTEL = Op 5575
+
+pattern OpSubgroupBlockWriteINTEL :: Op
+pattern OpSubgroupBlockWriteINTEL = Op 5576
+
+pattern OpSubgroupImageBlockReadINTEL :: Op
+pattern OpSubgroupImageBlockReadINTEL = Op 5577
+
+pattern OpSubgroupImageBlockWriteINTEL :: Op
+pattern OpSubgroupImageBlockWriteINTEL = Op 5578
+
+pattern OpSubgroupImageMediaBlockReadINTEL :: Op
+pattern OpSubgroupImageMediaBlockReadINTEL = Op 5580
+
+pattern OpSubgroupImageMediaBlockWriteINTEL :: Op
+pattern OpSubgroupImageMediaBlockWriteINTEL = Op 5581
+
+pattern OpUCountLeadingZerosINTEL :: Op
+pattern OpUCountLeadingZerosINTEL = Op 5585
+
+pattern OpUCountTrailingZerosINTEL :: Op
+pattern OpUCountTrailingZerosINTEL = Op 5586
+
+pattern OpAbsISubINTEL :: Op
+pattern OpAbsISubINTEL = Op 5587
+
+pattern OpAbsUSubINTEL :: Op
+pattern OpAbsUSubINTEL = Op 5588
+
+pattern OpIAddSatINTEL :: Op
+pattern OpIAddSatINTEL = Op 5589
+
+pattern OpUAddSatINTEL :: Op
+pattern OpUAddSatINTEL = Op 5590
+
+pattern OpIAverageINTEL :: Op
+pattern OpIAverageINTEL = Op 5591
+
+pattern OpUAverageINTEL :: Op
+pattern OpUAverageINTEL = Op 5592
+
+pattern OpIAverageRoundedINTEL :: Op
+pattern OpIAverageRoundedINTEL = Op 5593
+
+pattern OpUAverageRoundedINTEL :: Op
+pattern OpUAverageRoundedINTEL = Op 5594
+
+pattern OpISubSatINTEL :: Op
+pattern OpISubSatINTEL = Op 5595
+
+pattern OpUSubSatINTEL :: Op
+pattern OpUSubSatINTEL = Op 5596
+
+pattern OpIMul32x16INTEL :: Op
+pattern OpIMul32x16INTEL = Op 5597
+
+pattern OpUMul32x16INTEL :: Op
+pattern OpUMul32x16INTEL = Op 5598
+
+pattern OpConstantFunctionPointerINTEL :: Op
+pattern OpConstantFunctionPointerINTEL = Op 5600
+
+pattern OpFunctionPointerCallINTEL :: Op
+pattern OpFunctionPointerCallINTEL = Op 5601
+
+pattern OpAsmTargetINTEL :: Op
+pattern OpAsmTargetINTEL = Op 5609
+
+pattern OpAsmINTEL :: Op
+pattern OpAsmINTEL = Op 5610
+
+pattern OpAsmCallINTEL :: Op
+pattern OpAsmCallINTEL = Op 5611
+
+pattern OpAtomicFMinEXT :: Op
+pattern OpAtomicFMinEXT = Op 5614
+
+pattern OpAtomicFMaxEXT :: Op
+pattern OpAtomicFMaxEXT = Op 5615
+
+pattern OpAssumeTrueKHR :: Op
+pattern OpAssumeTrueKHR = Op 5630
+
+pattern OpExpectKHR :: Op
+pattern OpExpectKHR = Op 5631
+
+pattern OpDecorateString :: Op
+pattern OpDecorateString = Op 5632
+
+pattern OpDecorateStringGOOGLE :: Op
+pattern OpDecorateStringGOOGLE = Op 5632
+
+pattern OpMemberDecorateString :: Op
+pattern OpMemberDecorateString = Op 5633
+
+pattern OpMemberDecorateStringGOOGLE :: Op
+pattern OpMemberDecorateStringGOOGLE = Op 5633
+
+pattern OpVmeImageINTEL :: Op
+pattern OpVmeImageINTEL = Op 5699
+
+pattern OpTypeVmeImageINTEL :: Op
+pattern OpTypeVmeImageINTEL = Op 5700
+
+pattern OpTypeAvcImePayloadINTEL :: Op
+pattern OpTypeAvcImePayloadINTEL = Op 5701
+
+pattern OpTypeAvcRefPayloadINTEL :: Op
+pattern OpTypeAvcRefPayloadINTEL = Op 5702
+
+pattern OpTypeAvcSicPayloadINTEL :: Op
+pattern OpTypeAvcSicPayloadINTEL = Op 5703
+
+pattern OpTypeAvcMcePayloadINTEL :: Op
+pattern OpTypeAvcMcePayloadINTEL = Op 5704
+
+pattern OpTypeAvcMceResultINTEL :: Op
+pattern OpTypeAvcMceResultINTEL = Op 5705
+
+pattern OpTypeAvcImeResultINTEL :: Op
+pattern OpTypeAvcImeResultINTEL = Op 5706
+
+pattern OpTypeAvcImeResultSingleReferenceStreamoutINTEL :: Op
+pattern OpTypeAvcImeResultSingleReferenceStreamoutINTEL = Op 5707
+
+pattern OpTypeAvcImeResultDualReferenceStreamoutINTEL :: Op
+pattern OpTypeAvcImeResultDualReferenceStreamoutINTEL = Op 5708
+
+pattern OpTypeAvcImeSingleReferenceStreaminINTEL :: Op
+pattern OpTypeAvcImeSingleReferenceStreaminINTEL = Op 5709
+
+pattern OpTypeAvcImeDualReferenceStreaminINTEL :: Op
+pattern OpTypeAvcImeDualReferenceStreaminINTEL = Op 5710
+
+pattern OpTypeAvcRefResultINTEL :: Op
+pattern OpTypeAvcRefResultINTEL = Op 5711
+
+pattern OpTypeAvcSicResultINTEL :: Op
+pattern OpTypeAvcSicResultINTEL = Op 5712
+
+pattern OpSubgroupAvcMceGetDefaultInterBaseMultiReferencePenaltyINTEL :: Op
+pattern OpSubgroupAvcMceGetDefaultInterBaseMultiReferencePenaltyINTEL = Op 5713
+
+pattern OpSubgroupAvcMceSetInterBaseMultiReferencePenaltyINTEL :: Op
+pattern OpSubgroupAvcMceSetInterBaseMultiReferencePenaltyINTEL = Op 5714
+
+pattern OpSubgroupAvcMceGetDefaultInterShapePenaltyINTEL :: Op
+pattern OpSubgroupAvcMceGetDefaultInterShapePenaltyINTEL = Op 5715
+
+pattern OpSubgroupAvcMceSetInterShapePenaltyINTEL :: Op
+pattern OpSubgroupAvcMceSetInterShapePenaltyINTEL = Op 5716
+
+pattern OpSubgroupAvcMceGetDefaultInterDirectionPenaltyINTEL :: Op
+pattern OpSubgroupAvcMceGetDefaultInterDirectionPenaltyINTEL = Op 5717
+
+pattern OpSubgroupAvcMceSetInterDirectionPenaltyINTEL :: Op
+pattern OpSubgroupAvcMceSetInterDirectionPenaltyINTEL = Op 5718
+
+pattern OpSubgroupAvcMceGetDefaultIntraLumaShapePenaltyINTEL :: Op
+pattern OpSubgroupAvcMceGetDefaultIntraLumaShapePenaltyINTEL = Op 5719
+
+pattern OpSubgroupAvcMceGetDefaultInterMotionVectorCostTableINTEL :: Op
+pattern OpSubgroupAvcMceGetDefaultInterMotionVectorCostTableINTEL = Op 5720
+
+pattern OpSubgroupAvcMceGetDefaultHighPenaltyCostTableINTEL :: Op
+pattern OpSubgroupAvcMceGetDefaultHighPenaltyCostTableINTEL = Op 5721
+
+pattern OpSubgroupAvcMceGetDefaultMediumPenaltyCostTableINTEL :: Op
+pattern OpSubgroupAvcMceGetDefaultMediumPenaltyCostTableINTEL = Op 5722
+
+pattern OpSubgroupAvcMceGetDefaultLowPenaltyCostTableINTEL :: Op
+pattern OpSubgroupAvcMceGetDefaultLowPenaltyCostTableINTEL = Op 5723
+
+pattern OpSubgroupAvcMceSetMotionVectorCostFunctionINTEL :: Op
+pattern OpSubgroupAvcMceSetMotionVectorCostFunctionINTEL = Op 5724
+
+pattern OpSubgroupAvcMceGetDefaultIntraLumaModePenaltyINTEL :: Op
+pattern OpSubgroupAvcMceGetDefaultIntraLumaModePenaltyINTEL = Op 5725
+
+pattern OpSubgroupAvcMceGetDefaultNonDcLumaIntraPenaltyINTEL :: Op
+pattern OpSubgroupAvcMceGetDefaultNonDcLumaIntraPenaltyINTEL = Op 5726
+
+pattern OpSubgroupAvcMceGetDefaultIntraChromaModeBasePenaltyINTEL :: Op
+pattern OpSubgroupAvcMceGetDefaultIntraChromaModeBasePenaltyINTEL = Op 5727
+
+pattern OpSubgroupAvcMceSetAcOnlyHaarINTEL :: Op
+pattern OpSubgroupAvcMceSetAcOnlyHaarINTEL = Op 5728
+
+pattern OpSubgroupAvcMceSetSourceInterlacedFieldPolarityINTEL :: Op
+pattern OpSubgroupAvcMceSetSourceInterlacedFieldPolarityINTEL = Op 5729
+
+pattern OpSubgroupAvcMceSetSingleReferenceInterlacedFieldPolarityINTEL :: Op
+pattern OpSubgroupAvcMceSetSingleReferenceInterlacedFieldPolarityINTEL = Op 5730
+
+pattern OpSubgroupAvcMceSetDualReferenceInterlacedFieldPolaritiesINTEL :: Op
+pattern OpSubgroupAvcMceSetDualReferenceInterlacedFieldPolaritiesINTEL = Op 5731
+
+pattern OpSubgroupAvcMceConvertToImePayloadINTEL :: Op
+pattern OpSubgroupAvcMceConvertToImePayloadINTEL = Op 5732
+
+pattern OpSubgroupAvcMceConvertToImeResultINTEL :: Op
+pattern OpSubgroupAvcMceConvertToImeResultINTEL = Op 5733
+
+pattern OpSubgroupAvcMceConvertToRefPayloadINTEL :: Op
+pattern OpSubgroupAvcMceConvertToRefPayloadINTEL = Op 5734
+
+pattern OpSubgroupAvcMceConvertToRefResultINTEL :: Op
+pattern OpSubgroupAvcMceConvertToRefResultINTEL = Op 5735
+
+pattern OpSubgroupAvcMceConvertToSicPayloadINTEL :: Op
+pattern OpSubgroupAvcMceConvertToSicPayloadINTEL = Op 5736
+
+pattern OpSubgroupAvcMceConvertToSicResultINTEL :: Op
+pattern OpSubgroupAvcMceConvertToSicResultINTEL = Op 5737
+
+pattern OpSubgroupAvcMceGetMotionVectorsINTEL :: Op
+pattern OpSubgroupAvcMceGetMotionVectorsINTEL = Op 5738
+
+pattern OpSubgroupAvcMceGetInterDistortionsINTEL :: Op
+pattern OpSubgroupAvcMceGetInterDistortionsINTEL = Op 5739
+
+pattern OpSubgroupAvcMceGetBestInterDistortionsINTEL :: Op
+pattern OpSubgroupAvcMceGetBestInterDistortionsINTEL = Op 5740
+
+pattern OpSubgroupAvcMceGetInterMajorShapeINTEL :: Op
+pattern OpSubgroupAvcMceGetInterMajorShapeINTEL = Op 5741
+
+pattern OpSubgroupAvcMceGetInterMinorShapeINTEL :: Op
+pattern OpSubgroupAvcMceGetInterMinorShapeINTEL = Op 5742
+
+pattern OpSubgroupAvcMceGetInterDirectionsINTEL :: Op
+pattern OpSubgroupAvcMceGetInterDirectionsINTEL = Op 5743
+
+pattern OpSubgroupAvcMceGetInterMotionVectorCountINTEL :: Op
+pattern OpSubgroupAvcMceGetInterMotionVectorCountINTEL = Op 5744
+
+pattern OpSubgroupAvcMceGetInterReferenceIdsINTEL :: Op
+pattern OpSubgroupAvcMceGetInterReferenceIdsINTEL = Op 5745
+
+pattern OpSubgroupAvcMceGetInterReferenceInterlacedFieldPolaritiesINTEL :: Op
+pattern OpSubgroupAvcMceGetInterReferenceInterlacedFieldPolaritiesINTEL = Op 5746
+
+pattern OpSubgroupAvcImeInitializeINTEL :: Op
+pattern OpSubgroupAvcImeInitializeINTEL = Op 5747
+
+pattern OpSubgroupAvcImeSetSingleReferenceINTEL :: Op
+pattern OpSubgroupAvcImeSetSingleReferenceINTEL = Op 5748
+
+pattern OpSubgroupAvcImeSetDualReferenceINTEL :: Op
+pattern OpSubgroupAvcImeSetDualReferenceINTEL = Op 5749
+
+pattern OpSubgroupAvcImeRefWindowSizeINTEL :: Op
+pattern OpSubgroupAvcImeRefWindowSizeINTEL = Op 5750
+
+pattern OpSubgroupAvcImeAdjustRefOffsetINTEL :: Op
+pattern OpSubgroupAvcImeAdjustRefOffsetINTEL = Op 5751
+
+pattern OpSubgroupAvcImeConvertToMcePayloadINTEL :: Op
+pattern OpSubgroupAvcImeConvertToMcePayloadINTEL = Op 5752
+
+pattern OpSubgroupAvcImeSetMaxMotionVectorCountINTEL :: Op
+pattern OpSubgroupAvcImeSetMaxMotionVectorCountINTEL = Op 5753
+
+pattern OpSubgroupAvcImeSetUnidirectionalMixDisableINTEL :: Op
+pattern OpSubgroupAvcImeSetUnidirectionalMixDisableINTEL = Op 5754
+
+pattern OpSubgroupAvcImeSetEarlySearchTerminationThresholdINTEL :: Op
+pattern OpSubgroupAvcImeSetEarlySearchTerminationThresholdINTEL = Op 5755
+
+pattern OpSubgroupAvcImeSetWeightedSadINTEL :: Op
+pattern OpSubgroupAvcImeSetWeightedSadINTEL = Op 5756
+
+pattern OpSubgroupAvcImeEvaluateWithSingleReferenceINTEL :: Op
+pattern OpSubgroupAvcImeEvaluateWithSingleReferenceINTEL = Op 5757
+
+pattern OpSubgroupAvcImeEvaluateWithDualReferenceINTEL :: Op
+pattern OpSubgroupAvcImeEvaluateWithDualReferenceINTEL = Op 5758
+
+pattern OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminINTEL :: Op
+pattern OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminINTEL = Op 5759
+
+pattern OpSubgroupAvcImeEvaluateWithDualReferenceStreaminINTEL :: Op
+pattern OpSubgroupAvcImeEvaluateWithDualReferenceStreaminINTEL = Op 5760
+
+pattern OpSubgroupAvcImeEvaluateWithSingleReferenceStreamoutINTEL :: Op
+pattern OpSubgroupAvcImeEvaluateWithSingleReferenceStreamoutINTEL = Op 5761
+
+pattern OpSubgroupAvcImeEvaluateWithDualReferenceStreamoutINTEL :: Op
+pattern OpSubgroupAvcImeEvaluateWithDualReferenceStreamoutINTEL = Op 5762
+
+pattern OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminoutINTEL :: Op
+pattern OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminoutINTEL = Op 5763
+
+pattern OpSubgroupAvcImeEvaluateWithDualReferenceStreaminoutINTEL :: Op
+pattern OpSubgroupAvcImeEvaluateWithDualReferenceStreaminoutINTEL = Op 5764
+
+pattern OpSubgroupAvcImeConvertToMceResultINTEL :: Op
+pattern OpSubgroupAvcImeConvertToMceResultINTEL = Op 5765
+
+pattern OpSubgroupAvcImeGetSingleReferenceStreaminINTEL :: Op
+pattern OpSubgroupAvcImeGetSingleReferenceStreaminINTEL = Op 5766
+
+pattern OpSubgroupAvcImeGetDualReferenceStreaminINTEL :: Op
+pattern OpSubgroupAvcImeGetDualReferenceStreaminINTEL = Op 5767
+
+pattern OpSubgroupAvcImeStripSingleReferenceStreamoutINTEL :: Op
+pattern OpSubgroupAvcImeStripSingleReferenceStreamoutINTEL = Op 5768
+
+pattern OpSubgroupAvcImeStripDualReferenceStreamoutINTEL :: Op
+pattern OpSubgroupAvcImeStripDualReferenceStreamoutINTEL = Op 5769
+
+pattern OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeMotionVectorsINTEL :: Op
+pattern OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeMotionVectorsINTEL = Op 5770
+
+pattern OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeDistortionsINTEL :: Op
+pattern OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeDistortionsINTEL = Op 5771
+
+pattern OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeReferenceIdsINTEL :: Op
+pattern OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeReferenceIdsINTEL = Op 5772
+
+pattern OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeMotionVectorsINTEL :: Op
+pattern OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeMotionVectorsINTEL = Op 5773
+
+pattern OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeDistortionsINTEL :: Op
+pattern OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeDistortionsINTEL = Op 5774
+
+pattern OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeReferenceIdsINTEL :: Op
+pattern OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeReferenceIdsINTEL = Op 5775
+
+pattern OpSubgroupAvcImeGetBorderReachedINTEL :: Op
+pattern OpSubgroupAvcImeGetBorderReachedINTEL = Op 5776
+
+pattern OpSubgroupAvcImeGetTruncatedSearchIndicationINTEL :: Op
+pattern OpSubgroupAvcImeGetTruncatedSearchIndicationINTEL = Op 5777
+
+pattern OpSubgroupAvcImeGetUnidirectionalEarlySearchTerminationINTEL :: Op
+pattern OpSubgroupAvcImeGetUnidirectionalEarlySearchTerminationINTEL = Op 5778
+
+pattern OpSubgroupAvcImeGetWeightingPatternMinimumMotionVectorINTEL :: Op
+pattern OpSubgroupAvcImeGetWeightingPatternMinimumMotionVectorINTEL = Op 5779
+
+pattern OpSubgroupAvcImeGetWeightingPatternMinimumDistortionINTEL :: Op
+pattern OpSubgroupAvcImeGetWeightingPatternMinimumDistortionINTEL = Op 5780
+
+pattern OpSubgroupAvcFmeInitializeINTEL :: Op
+pattern OpSubgroupAvcFmeInitializeINTEL = Op 5781
+
+pattern OpSubgroupAvcBmeInitializeINTEL :: Op
+pattern OpSubgroupAvcBmeInitializeINTEL = Op 5782
+
+pattern OpSubgroupAvcRefConvertToMcePayloadINTEL :: Op
+pattern OpSubgroupAvcRefConvertToMcePayloadINTEL = Op 5783
+
+pattern OpSubgroupAvcRefSetBidirectionalMixDisableINTEL :: Op
+pattern OpSubgroupAvcRefSetBidirectionalMixDisableINTEL = Op 5784
+
+pattern OpSubgroupAvcRefSetBilinearFilterEnableINTEL :: Op
+pattern OpSubgroupAvcRefSetBilinearFilterEnableINTEL = Op 5785
+
+pattern OpSubgroupAvcRefEvaluateWithSingleReferenceINTEL :: Op
+pattern OpSubgroupAvcRefEvaluateWithSingleReferenceINTEL = Op 5786
+
+pattern OpSubgroupAvcRefEvaluateWithDualReferenceINTEL :: Op
+pattern OpSubgroupAvcRefEvaluateWithDualReferenceINTEL = Op 5787
+
+pattern OpSubgroupAvcRefEvaluateWithMultiReferenceINTEL :: Op
+pattern OpSubgroupAvcRefEvaluateWithMultiReferenceINTEL = Op 5788
+
+pattern OpSubgroupAvcRefEvaluateWithMultiReferenceInterlacedINTEL :: Op
+pattern OpSubgroupAvcRefEvaluateWithMultiReferenceInterlacedINTEL = Op 5789
+
+pattern OpSubgroupAvcRefConvertToMceResultINTEL :: Op
+pattern OpSubgroupAvcRefConvertToMceResultINTEL = Op 5790
+
+pattern OpSubgroupAvcSicInitializeINTEL :: Op
+pattern OpSubgroupAvcSicInitializeINTEL = Op 5791
+
+pattern OpSubgroupAvcSicConfigureSkcINTEL :: Op
+pattern OpSubgroupAvcSicConfigureSkcINTEL = Op 5792
+
+pattern OpSubgroupAvcSicConfigureIpeLumaINTEL :: Op
+pattern OpSubgroupAvcSicConfigureIpeLumaINTEL = Op 5793
+
+pattern OpSubgroupAvcSicConfigureIpeLumaChromaINTEL :: Op
+pattern OpSubgroupAvcSicConfigureIpeLumaChromaINTEL = Op 5794
+
+pattern OpSubgroupAvcSicGetMotionVectorMaskINTEL :: Op
+pattern OpSubgroupAvcSicGetMotionVectorMaskINTEL = Op 5795
+
+pattern OpSubgroupAvcSicConvertToMcePayloadINTEL :: Op
+pattern OpSubgroupAvcSicConvertToMcePayloadINTEL = Op 5796
+
+pattern OpSubgroupAvcSicSetIntraLumaShapePenaltyINTEL :: Op
+pattern OpSubgroupAvcSicSetIntraLumaShapePenaltyINTEL = Op 5797
+
+pattern OpSubgroupAvcSicSetIntraLumaModeCostFunctionINTEL :: Op
+pattern OpSubgroupAvcSicSetIntraLumaModeCostFunctionINTEL = Op 5798
+
+pattern OpSubgroupAvcSicSetIntraChromaModeCostFunctionINTEL :: Op
+pattern OpSubgroupAvcSicSetIntraChromaModeCostFunctionINTEL = Op 5799
+
+pattern OpSubgroupAvcSicSetBilinearFilterEnableINTEL :: Op
+pattern OpSubgroupAvcSicSetBilinearFilterEnableINTEL = Op 5800
+
+pattern OpSubgroupAvcSicSetSkcForwardTransformEnableINTEL :: Op
+pattern OpSubgroupAvcSicSetSkcForwardTransformEnableINTEL = Op 5801
+
+pattern OpSubgroupAvcSicSetBlockBasedRawSkipSadINTEL :: Op
+pattern OpSubgroupAvcSicSetBlockBasedRawSkipSadINTEL = Op 5802
+
+pattern OpSubgroupAvcSicEvaluateIpeINTEL :: Op
+pattern OpSubgroupAvcSicEvaluateIpeINTEL = Op 5803
+
+pattern OpSubgroupAvcSicEvaluateWithSingleReferenceINTEL :: Op
+pattern OpSubgroupAvcSicEvaluateWithSingleReferenceINTEL = Op 5804
+
+pattern OpSubgroupAvcSicEvaluateWithDualReferenceINTEL :: Op
+pattern OpSubgroupAvcSicEvaluateWithDualReferenceINTEL = Op 5805
+
+pattern OpSubgroupAvcSicEvaluateWithMultiReferenceINTEL :: Op
+pattern OpSubgroupAvcSicEvaluateWithMultiReferenceINTEL = Op 5806
+
+pattern OpSubgroupAvcSicEvaluateWithMultiReferenceInterlacedINTEL :: Op
+pattern OpSubgroupAvcSicEvaluateWithMultiReferenceInterlacedINTEL = Op 5807
+
+pattern OpSubgroupAvcSicConvertToMceResultINTEL :: Op
+pattern OpSubgroupAvcSicConvertToMceResultINTEL = Op 5808
+
+pattern OpSubgroupAvcSicGetIpeLumaShapeINTEL :: Op
+pattern OpSubgroupAvcSicGetIpeLumaShapeINTEL = Op 5809
+
+pattern OpSubgroupAvcSicGetBestIpeLumaDistortionINTEL :: Op
+pattern OpSubgroupAvcSicGetBestIpeLumaDistortionINTEL = Op 5810
+
+pattern OpSubgroupAvcSicGetBestIpeChromaDistortionINTEL :: Op
+pattern OpSubgroupAvcSicGetBestIpeChromaDistortionINTEL = Op 5811
+
+pattern OpSubgroupAvcSicGetPackedIpeLumaModesINTEL :: Op
+pattern OpSubgroupAvcSicGetPackedIpeLumaModesINTEL = Op 5812
+
+pattern OpSubgroupAvcSicGetIpeChromaModeINTEL :: Op
+pattern OpSubgroupAvcSicGetIpeChromaModeINTEL = Op 5813
+
+pattern OpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL :: Op
+pattern OpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL = Op 5814
+
+pattern OpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL :: Op
+pattern OpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL = Op 5815
+
+pattern OpSubgroupAvcSicGetInterRawSadsINTEL :: Op
+pattern OpSubgroupAvcSicGetInterRawSadsINTEL = Op 5816
+
+pattern OpVariableLengthArrayINTEL :: Op
+pattern OpVariableLengthArrayINTEL = Op 5818
+
+pattern OpSaveMemoryINTEL :: Op
+pattern OpSaveMemoryINTEL = Op 5819
+
+pattern OpRestoreMemoryINTEL :: Op
+pattern OpRestoreMemoryINTEL = Op 5820
+
+pattern OpArbitraryFloatSinCosPiINTEL :: Op
+pattern OpArbitraryFloatSinCosPiINTEL = Op 5840
+
+pattern OpArbitraryFloatCastINTEL :: Op
+pattern OpArbitraryFloatCastINTEL = Op 5841
+
+pattern OpArbitraryFloatCastFromIntINTEL :: Op
+pattern OpArbitraryFloatCastFromIntINTEL = Op 5842
+
+pattern OpArbitraryFloatCastToIntINTEL :: Op
+pattern OpArbitraryFloatCastToIntINTEL = Op 5843
+
+pattern OpArbitraryFloatAddINTEL :: Op
+pattern OpArbitraryFloatAddINTEL = Op 5846
+
+pattern OpArbitraryFloatSubINTEL :: Op
+pattern OpArbitraryFloatSubINTEL = Op 5847
+
+pattern OpArbitraryFloatMulINTEL :: Op
+pattern OpArbitraryFloatMulINTEL = Op 5848
+
+pattern OpArbitraryFloatDivINTEL :: Op
+pattern OpArbitraryFloatDivINTEL = Op 5849
+
+pattern OpArbitraryFloatGTINTEL :: Op
+pattern OpArbitraryFloatGTINTEL = Op 5850
+
+pattern OpArbitraryFloatGEINTEL :: Op
+pattern OpArbitraryFloatGEINTEL = Op 5851
+
+pattern OpArbitraryFloatLTINTEL :: Op
+pattern OpArbitraryFloatLTINTEL = Op 5852
+
+pattern OpArbitraryFloatLEINTEL :: Op
+pattern OpArbitraryFloatLEINTEL = Op 5853
+
+pattern OpArbitraryFloatEQINTEL :: Op
+pattern OpArbitraryFloatEQINTEL = Op 5854
+
+pattern OpArbitraryFloatRecipINTEL :: Op
+pattern OpArbitraryFloatRecipINTEL = Op 5855
+
+pattern OpArbitraryFloatRSqrtINTEL :: Op
+pattern OpArbitraryFloatRSqrtINTEL = Op 5856
+
+pattern OpArbitraryFloatCbrtINTEL :: Op
+pattern OpArbitraryFloatCbrtINTEL = Op 5857
+
+pattern OpArbitraryFloatHypotINTEL :: Op
+pattern OpArbitraryFloatHypotINTEL = Op 5858
+
+pattern OpArbitraryFloatSqrtINTEL :: Op
+pattern OpArbitraryFloatSqrtINTEL = Op 5859
+
+pattern OpArbitraryFloatLogINTEL :: Op
+pattern OpArbitraryFloatLogINTEL = Op 5860
+
+pattern OpArbitraryFloatLog2INTEL :: Op
+pattern OpArbitraryFloatLog2INTEL = Op 5861
+
+pattern OpArbitraryFloatLog10INTEL :: Op
+pattern OpArbitraryFloatLog10INTEL = Op 5862
+
+pattern OpArbitraryFloatLog1pINTEL :: Op
+pattern OpArbitraryFloatLog1pINTEL = Op 5863
+
+pattern OpArbitraryFloatExpINTEL :: Op
+pattern OpArbitraryFloatExpINTEL = Op 5864
+
+pattern OpArbitraryFloatExp2INTEL :: Op
+pattern OpArbitraryFloatExp2INTEL = Op 5865
+
+pattern OpArbitraryFloatExp10INTEL :: Op
+pattern OpArbitraryFloatExp10INTEL = Op 5866
+
+pattern OpArbitraryFloatExpm1INTEL :: Op
+pattern OpArbitraryFloatExpm1INTEL = Op 5867
+
+pattern OpArbitraryFloatSinINTEL :: Op
+pattern OpArbitraryFloatSinINTEL = Op 5868
+
+pattern OpArbitraryFloatCosINTEL :: Op
+pattern OpArbitraryFloatCosINTEL = Op 5869
+
+pattern OpArbitraryFloatSinCosINTEL :: Op
+pattern OpArbitraryFloatSinCosINTEL = Op 5870
+
+pattern OpArbitraryFloatSinPiINTEL :: Op
+pattern OpArbitraryFloatSinPiINTEL = Op 5871
+
+pattern OpArbitraryFloatCosPiINTEL :: Op
+pattern OpArbitraryFloatCosPiINTEL = Op 5872
+
+pattern OpArbitraryFloatASinINTEL :: Op
+pattern OpArbitraryFloatASinINTEL = Op 5873
+
+pattern OpArbitraryFloatASinPiINTEL :: Op
+pattern OpArbitraryFloatASinPiINTEL = Op 5874
+
+pattern OpArbitraryFloatACosINTEL :: Op
+pattern OpArbitraryFloatACosINTEL = Op 5875
+
+pattern OpArbitraryFloatACosPiINTEL :: Op
+pattern OpArbitraryFloatACosPiINTEL = Op 5876
+
+pattern OpArbitraryFloatATanINTEL :: Op
+pattern OpArbitraryFloatATanINTEL = Op 5877
+
+pattern OpArbitraryFloatATanPiINTEL :: Op
+pattern OpArbitraryFloatATanPiINTEL = Op 5878
+
+pattern OpArbitraryFloatATan2INTEL :: Op
+pattern OpArbitraryFloatATan2INTEL = Op 5879
+
+pattern OpArbitraryFloatPowINTEL :: Op
+pattern OpArbitraryFloatPowINTEL = Op 5880
+
+pattern OpArbitraryFloatPowRINTEL :: Op
+pattern OpArbitraryFloatPowRINTEL = Op 5881
+
+pattern OpArbitraryFloatPowNINTEL :: Op
+pattern OpArbitraryFloatPowNINTEL = Op 5882
+
+pattern OpLoopControlINTEL :: Op
+pattern OpLoopControlINTEL = Op 5887
+
+pattern OpAliasDomainDeclINTEL :: Op
+pattern OpAliasDomainDeclINTEL = Op 5911
+
+pattern OpAliasScopeDeclINTEL :: Op
+pattern OpAliasScopeDeclINTEL = Op 5912
+
+pattern OpAliasScopeListDeclINTEL :: Op
+pattern OpAliasScopeListDeclINTEL = Op 5913
+
+pattern OpFixedSqrtINTEL :: Op
+pattern OpFixedSqrtINTEL = Op 5923
+
+pattern OpFixedRecipINTEL :: Op
+pattern OpFixedRecipINTEL = Op 5924
+
+pattern OpFixedRsqrtINTEL :: Op
+pattern OpFixedRsqrtINTEL = Op 5925
+
+pattern OpFixedSinINTEL :: Op
+pattern OpFixedSinINTEL = Op 5926
+
+pattern OpFixedCosINTEL :: Op
+pattern OpFixedCosINTEL = Op 5927
+
+pattern OpFixedSinCosINTEL :: Op
+pattern OpFixedSinCosINTEL = Op 5928
+
+pattern OpFixedSinPiINTEL :: Op
+pattern OpFixedSinPiINTEL = Op 5929
+
+pattern OpFixedCosPiINTEL :: Op
+pattern OpFixedCosPiINTEL = Op 5930
+
+pattern OpFixedSinCosPiINTEL :: Op
+pattern OpFixedSinCosPiINTEL = Op 5931
+
+pattern OpFixedLogINTEL :: Op
+pattern OpFixedLogINTEL = Op 5932
+
+pattern OpFixedExpINTEL :: Op
+pattern OpFixedExpINTEL = Op 5933
+
+pattern OpPtrCastToCrossWorkgroupINTEL :: Op
+pattern OpPtrCastToCrossWorkgroupINTEL = Op 5934
+
+pattern OpCrossWorkgroupCastToPtrINTEL :: Op
+pattern OpCrossWorkgroupCastToPtrINTEL = Op 5938
+
+pattern OpReadPipeBlockingINTEL :: Op
+pattern OpReadPipeBlockingINTEL = Op 5946
+
+pattern OpWritePipeBlockingINTEL :: Op
+pattern OpWritePipeBlockingINTEL = Op 5947
+
+pattern OpFPGARegINTEL :: Op
+pattern OpFPGARegINTEL = Op 5949
+
+pattern OpRayQueryGetRayTMinKHR :: Op
+pattern OpRayQueryGetRayTMinKHR = Op 6016
+
+pattern OpRayQueryGetRayFlagsKHR :: Op
+pattern OpRayQueryGetRayFlagsKHR = Op 6017
+
+pattern OpRayQueryGetIntersectionTKHR :: Op
+pattern OpRayQueryGetIntersectionTKHR = Op 6018
+
+pattern OpRayQueryGetIntersectionInstanceCustomIndexKHR :: Op
+pattern OpRayQueryGetIntersectionInstanceCustomIndexKHR = Op 6019
+
+pattern OpRayQueryGetIntersectionInstanceIdKHR :: Op
+pattern OpRayQueryGetIntersectionInstanceIdKHR = Op 6020
+
+pattern OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR :: Op
+pattern OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR = Op 6021
+
+pattern OpRayQueryGetIntersectionGeometryIndexKHR :: Op
+pattern OpRayQueryGetIntersectionGeometryIndexKHR = Op 6022
+
+pattern OpRayQueryGetIntersectionPrimitiveIndexKHR :: Op
+pattern OpRayQueryGetIntersectionPrimitiveIndexKHR = Op 6023
+
+pattern OpRayQueryGetIntersectionBarycentricsKHR :: Op
+pattern OpRayQueryGetIntersectionBarycentricsKHR = Op 6024
+
+pattern OpRayQueryGetIntersectionFrontFaceKHR :: Op
+pattern OpRayQueryGetIntersectionFrontFaceKHR = Op 6025
+
+pattern OpRayQueryGetIntersectionCandidateAABBOpaqueKHR :: Op
+pattern OpRayQueryGetIntersectionCandidateAABBOpaqueKHR = Op 6026
+
+pattern OpRayQueryGetIntersectionObjectRayDirectionKHR :: Op
+pattern OpRayQueryGetIntersectionObjectRayDirectionKHR = Op 6027
+
+pattern OpRayQueryGetIntersectionObjectRayOriginKHR :: Op
+pattern OpRayQueryGetIntersectionObjectRayOriginKHR = Op 6028
+
+pattern OpRayQueryGetWorldRayDirectionKHR :: Op
+pattern OpRayQueryGetWorldRayDirectionKHR = Op 6029
+
+pattern OpRayQueryGetWorldRayOriginKHR :: Op
+pattern OpRayQueryGetWorldRayOriginKHR = Op 6030
+
+pattern OpRayQueryGetIntersectionObjectToWorldKHR :: Op
+pattern OpRayQueryGetIntersectionObjectToWorldKHR = Op 6031
+
+pattern OpRayQueryGetIntersectionWorldToObjectKHR :: Op
+pattern OpRayQueryGetIntersectionWorldToObjectKHR = Op 6032
+
+pattern OpAtomicFAddEXT :: Op
+pattern OpAtomicFAddEXT = Op 6035
+
+pattern OpTypeBufferSurfaceINTEL :: Op
+pattern OpTypeBufferSurfaceINTEL = Op 6086
+
+pattern OpTypeStructContinuedINTEL :: Op
+pattern OpTypeStructContinuedINTEL = Op 6090
+
+pattern OpConstantCompositeContinuedINTEL :: Op
+pattern OpConstantCompositeContinuedINTEL = Op 6091
+
+pattern OpSpecConstantCompositeContinuedINTEL :: Op
+pattern OpSpecConstantCompositeContinuedINTEL = Op 6092
+
+pattern OpControlBarrierArriveINTEL :: Op
+pattern OpControlBarrierArriveINTEL = Op 6142
+
+pattern OpControlBarrierWaitINTEL :: Op
+pattern OpControlBarrierWaitINTEL = Op 6143
+
+pattern OpGroupIMulKHR :: Op
+pattern OpGroupIMulKHR = Op 6401
+
+pattern OpGroupFMulKHR :: Op
+pattern OpGroupFMulKHR = Op 6402
+
+pattern OpGroupBitwiseAndKHR :: Op
+pattern OpGroupBitwiseAndKHR = Op 6403
+
+pattern OpGroupBitwiseOrKHR :: Op
+pattern OpGroupBitwiseOrKHR = Op 6404
+
+pattern OpGroupBitwiseXorKHR :: Op
+pattern OpGroupBitwiseXorKHR = Op 6405
+
+pattern OpGroupLogicalAndKHR :: Op
+pattern OpGroupLogicalAndKHR = Op 6406
+
+pattern OpGroupLogicalOrKHR :: Op
+pattern OpGroupLogicalOrKHR = Op 6407
+
+pattern OpGroupLogicalXorKHR :: Op
+pattern OpGroupLogicalXorKHR = Op 6408
+
+pattern OpMax :: Op
+pattern OpMax = Op 0x7fffffff
diff --git a/lib/Data/SpirV/Reflect/Enums/SpirvStorageClass.hs b/lib/Data/SpirV/Reflect/Enums/SpirvStorageClass.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/SpirV/Reflect/Enums/SpirvStorageClass.hs
@@ -0,0 +1,99 @@
+module Data.SpirV.Reflect.Enums.SpirvStorageClass where
+
+import Data.SpirV.Reflect.Enums.Common
+
+newtype StorageClass = StorageClass Int32
+  deriving newtype (Eq, Ord, Show, Enum, Bounded)
+
+pattern StorageClassUniformConstant :: StorageClass
+pattern StorageClassUniformConstant = StorageClass 0
+
+pattern StorageClassInput :: StorageClass
+pattern StorageClassInput = StorageClass 1
+
+pattern StorageClassUniform :: StorageClass
+pattern StorageClassUniform = StorageClass 2
+
+pattern StorageClassOutput :: StorageClass
+pattern StorageClassOutput = StorageClass 3
+
+pattern StorageClassWorkgroup :: StorageClass
+pattern StorageClassWorkgroup = StorageClass 4
+
+pattern StorageClassCrossWorkgroup :: StorageClass
+pattern StorageClassCrossWorkgroup = StorageClass 5
+
+pattern StorageClassPrivate :: StorageClass
+pattern StorageClassPrivate = StorageClass 6
+
+pattern StorageClassFunction :: StorageClass
+pattern StorageClassFunction = StorageClass 7
+
+pattern StorageClassGeneric :: StorageClass
+pattern StorageClassGeneric = StorageClass 8
+
+pattern StorageClassPushConstant :: StorageClass
+pattern StorageClassPushConstant = StorageClass 9
+
+pattern StorageClassAtomicCounter :: StorageClass
+pattern StorageClassAtomicCounter = StorageClass 10
+
+pattern StorageClassImage :: StorageClass
+pattern StorageClassImage = StorageClass 11
+
+pattern StorageClassStorageBuffer :: StorageClass
+pattern StorageClassStorageBuffer = StorageClass 12
+
+pattern StorageClassCallableDataKHR :: StorageClass
+pattern StorageClassCallableDataKHR = StorageClass 5328
+
+pattern StorageClassCallableDataNV :: StorageClass
+pattern StorageClassCallableDataNV = StorageClass 5328
+
+pattern StorageClassIncomingCallableDataKHR :: StorageClass
+pattern StorageClassIncomingCallableDataKHR = StorageClass 5329
+
+pattern StorageClassIncomingCallableDataNV :: StorageClass
+pattern StorageClassIncomingCallableDataNV = StorageClass 5329
+
+pattern StorageClassRayPayloadKHR :: StorageClass
+pattern StorageClassRayPayloadKHR = StorageClass 5338
+
+pattern StorageClassRayPayloadNV :: StorageClass
+pattern StorageClassRayPayloadNV = StorageClass 5338
+
+pattern StorageClassHitAttributeKHR :: StorageClass
+pattern StorageClassHitAttributeKHR = StorageClass 5339
+
+pattern StorageClassHitAttributeNV :: StorageClass
+pattern StorageClassHitAttributeNV = StorageClass 5339
+
+pattern StorageClassIncomingRayPayloadKHR :: StorageClass
+pattern StorageClassIncomingRayPayloadKHR = StorageClass 5342
+
+pattern StorageClassIncomingRayPayloadNV :: StorageClass
+pattern StorageClassIncomingRayPayloadNV = StorageClass 5342
+
+pattern StorageClassShaderRecordBufferKHR :: StorageClass
+pattern StorageClassShaderRecordBufferKHR = StorageClass 5343
+
+pattern StorageClassShaderRecordBufferNV :: StorageClass
+pattern StorageClassShaderRecordBufferNV = StorageClass 5343
+
+pattern StorageClassPhysicalStorageBuffer :: StorageClass
+pattern StorageClassPhysicalStorageBuffer = StorageClass 5349
+
+pattern StorageClassPhysicalStorageBufferEXT :: StorageClass
+pattern StorageClassPhysicalStorageBufferEXT = StorageClass 5349
+
+pattern StorageClassCodeSectionINTEL :: StorageClass
+pattern StorageClassCodeSectionINTEL = StorageClass 5605
+
+pattern StorageClassDeviceOnlyINTEL :: StorageClass
+pattern StorageClassDeviceOnlyINTEL = StorageClass 5936
+
+pattern StorageClassHostOnlyINTEL :: StorageClass
+pattern StorageClassHostOnlyINTEL = StorageClass 5937
+
+pattern StorageClassMax :: StorageClass
+pattern StorageClassMax = StorageClass 0x7fffffff
diff --git a/lib/Data/SpirV/Reflect/Enums/TypeFlags.hs b/lib/Data/SpirV/Reflect/Enums/TypeFlags.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/SpirV/Reflect/Enums/TypeFlags.hs
@@ -0,0 +1,80 @@
+module Data.SpirV.Reflect.Enums.TypeFlags where
+
+import Control.Monad (guard)
+
+import Data.SpirV.Reflect.Enums.Common
+
+type TypeFlags = TypeFlagBits
+
+newtype TypeFlagBits = TypeFlagBits Flags
+  deriving newtype (Eq, Ord, Show, Bits, FiniteBits)
+
+pattern TYPE_FLAG_UNDEFINED :: TypeFlagBits
+pattern TYPE_FLAG_UNDEFINED = TypeFlagBits 0x00000000
+
+pattern TYPE_FLAG_VOID :: TypeFlagBits
+pattern TYPE_FLAG_VOID = TypeFlagBits 0x00000001
+
+pattern TYPE_FLAG_BOOL :: TypeFlagBits
+pattern TYPE_FLAG_BOOL = TypeFlagBits 0x00000002
+
+pattern TYPE_FLAG_INT :: TypeFlagBits
+pattern TYPE_FLAG_INT = TypeFlagBits 0x00000004
+
+pattern TYPE_FLAG_FLOAT :: TypeFlagBits
+pattern TYPE_FLAG_FLOAT = TypeFlagBits 0x00000008
+
+pattern TYPE_FLAG_VECTOR :: TypeFlagBits
+pattern TYPE_FLAG_VECTOR = TypeFlagBits 0x00000100
+
+pattern TYPE_FLAG_MATRIX :: TypeFlagBits
+pattern TYPE_FLAG_MATRIX = TypeFlagBits 0x00000200
+
+pattern TYPE_FLAG_EXTERNAL_IMAGE :: TypeFlagBits
+pattern TYPE_FLAG_EXTERNAL_IMAGE = TypeFlagBits 0x00010000
+
+pattern TYPE_FLAG_EXTERNAL_SAMPLER :: TypeFlagBits
+pattern TYPE_FLAG_EXTERNAL_SAMPLER = TypeFlagBits 0x00020000
+
+pattern TYPE_FLAG_EXTERNAL_SAMPLED_IMAGE :: TypeFlagBits
+pattern TYPE_FLAG_EXTERNAL_SAMPLED_IMAGE = TypeFlagBits 0x00040000
+
+pattern TYPE_FLAG_EXTERNAL_BLOCK :: TypeFlagBits
+pattern TYPE_FLAG_EXTERNAL_BLOCK = TypeFlagBits 0x00080000
+
+pattern TYPE_FLAG_EXTERNAL_ACCELERATION_STRUCTURE :: TypeFlagBits
+pattern TYPE_FLAG_EXTERNAL_ACCELERATION_STRUCTURE = TypeFlagBits 0x00100000
+
+pattern TYPE_FLAG_EXTERNAL_MASK :: TypeFlagBits
+pattern TYPE_FLAG_EXTERNAL_MASK = TypeFlagBits 0x00FF0000
+
+pattern TYPE_FLAG_STRUCT :: TypeFlagBits
+pattern TYPE_FLAG_STRUCT = TypeFlagBits 0x10000000
+
+pattern TYPE_FLAG_ARRAY :: TypeFlagBits
+pattern TYPE_FLAG_ARRAY = TypeFlagBits 0x20000000
+
+typeFlagBitNames :: IsString label => [(TypeFlagBits, label)]
+typeFlagBitNames =
+  [ (TYPE_FLAG_UNDEFINED, "UNDEFINED")
+  , (TYPE_FLAG_VOID, "VOID")
+  , (TYPE_FLAG_BOOL, "BOOL")
+  , (TYPE_FLAG_INT, "INT")
+  , (TYPE_FLAG_FLOAT, "FLOAT")
+  , (TYPE_FLAG_VECTOR, "VECTOR")
+  , (TYPE_FLAG_MATRIX, "MATRIX")
+  , (TYPE_FLAG_EXTERNAL_IMAGE, "EXTERNAL_IMAGE")
+  , (TYPE_FLAG_EXTERNAL_SAMPLER, "EXTERNAL_SAMPLER")
+  , (TYPE_FLAG_EXTERNAL_SAMPLED_IMAGE, "EXTERNAL_SAMPLED_IMAGE")
+  , (TYPE_FLAG_EXTERNAL_BLOCK, "EXTERNAL_BLOCK")
+  , (TYPE_FLAG_EXTERNAL_ACCELERATION_STRUCTURE, "EXTERNAL_ACCELERATION_STRUCTURE")
+  , (TYPE_FLAG_EXTERNAL_MASK, "EXTERNAL_MASK")
+  , (TYPE_FLAG_STRUCT, "STRUCT")
+  , (TYPE_FLAG_ARRAY, "ARRAY")
+  ]
+
+typeFlagsNames :: IsString label => TypeFlags -> [label]
+typeFlagsNames bits = do
+  (flag, name) <- drop 1 typeFlagBitNames
+  guard $ bits .&&. flag
+  pure name
diff --git a/lib/Data/SpirV/Reflect/InterfaceVariable.hs b/lib/Data/SpirV/Reflect/InterfaceVariable.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/SpirV/Reflect/InterfaceVariable.hs
@@ -0,0 +1,35 @@
+module Data.SpirV.Reflect.InterfaceVariable
+  ( InterfaceVariable(..)
+  , WordOffset(..)
+  ) where
+
+import Data.Text (Text)
+import Data.Vector (Vector)
+import Data.Word (Word32)
+import GHC.Generics (Generic)
+
+import Data.SpirV.Reflect.Enums qualified as Enums
+import Data.SpirV.Reflect.Traits qualified as Traits
+import Data.SpirV.Reflect.TypeDescription (TypeDescription)
+
+data InterfaceVariable = InterfaceVariable
+  { spirv_id         :: Maybe Word32
+  , name             :: Maybe Text
+  , location         :: Word32
+  , storage_class    :: Enums.StorageClass
+  , semantic         :: Maybe Text
+  , decoration_flags :: Enums.DecorationFlags
+  , built_in         :: Enums.BuiltIn
+  , numeric          :: Traits.Numeric
+  , array            :: Traits.Array
+  , members          :: Vector TypeDescription
+  , format           :: Enums.Format
+  , type_description :: Maybe TypeDescription
+  , word_offset      :: WordOffset
+  }
+  deriving (Eq, Show, Generic)
+
+newtype WordOffset = WordOffset
+  { location :: Word32
+  }
+  deriving (Eq, Show, Generic)
diff --git a/lib/Data/SpirV/Reflect/Module.hs b/lib/Data/SpirV/Reflect/Module.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/SpirV/Reflect/Module.hs
@@ -0,0 +1,29 @@
+module Data.SpirV.Reflect.Module
+  ( Module(..)
+  ) where
+
+import Data.Text (Text)
+import Data.Vector (Vector)
+import GHC.Generics (Generic)
+
+import Data.SpirV.Reflect.BlockVariable (BlockVariable)
+import Data.SpirV.Reflect.DescriptorBinding (DescriptorBinding)
+import Data.SpirV.Reflect.DescriptorSet (DescriptorSet)
+import Data.SpirV.Reflect.Enums qualified as Enums
+import Data.SpirV.Reflect.InterfaceVariable (InterfaceVariable)
+
+data Module = Module
+  { generator               :: Enums.Generator
+  , entry_point_name        :: Text
+  , entry_point_id          :: Int
+  , source_language         :: Int
+  , source_language_version :: Int
+  , spirv_execution_model   :: Int
+  , shader_stage            :: Int
+  , descriptor_bindings     :: Vector DescriptorBinding
+  , descriptor_sets         :: Vector DescriptorSet
+  , input_variables         :: Vector InterfaceVariable
+  , output_variables        :: Vector InterfaceVariable
+  , push_constants          :: Vector BlockVariable
+  }
+  deriving (Eq, Show, Generic)
diff --git a/lib/Data/SpirV/Reflect/Traits.hs b/lib/Data/SpirV/Reflect/Traits.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/SpirV/Reflect/Traits.hs
@@ -0,0 +1,49 @@
+module Data.SpirV.Reflect.Traits where
+
+import Data.Vector.Storable qualified as Storable
+import Data.Word (Word32)
+import GHC.Generics (Generic)
+
+import Data.SpirV.Reflect.Enums qualified as Enums
+
+data Numeric = Numeric
+  { scalar :: Scalar
+  , vector :: Vector
+  , matrix :: Matrix
+  }
+  deriving (Eq, Ord, Show, Generic)
+
+data Scalar = Scalar
+  { width      :: Word32
+  , signedness :: Word32
+  }
+  deriving (Eq, Ord, Show, Generic)
+
+data Vector = Vector
+  { component_count :: Word32
+  }
+  deriving (Eq, Ord, Show, Generic)
+
+data Matrix = Matrix
+  { column_count :: Word32
+  , row_count    :: Word32
+  , stride       :: Word32 -- ^ Measured in bytes
+  }
+  deriving (Eq, Ord, Show, Generic)
+
+data Array = Array
+  { dims_count :: Word32
+  , dims       :: Storable.Vector Word32
+  , stride     :: Maybe Word32
+  }
+  deriving (Eq, Ord, Show, Generic)
+
+data Image = Image
+  { dim          :: Enums.Dim
+  , depth        :: Word32
+  , arrayed      :: Word32
+  , ms           :: Word32 -- ^ 0: single-sampled, 1: multisampled
+  , sampled      :: Word32
+  , image_format :: Enums.ImageFormat
+  }
+  deriving (Eq, Ord, Show, Generic)
diff --git a/lib/Data/SpirV/Reflect/TypeDescription.hs b/lib/Data/SpirV/Reflect/TypeDescription.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/SpirV/Reflect/TypeDescription.hs
@@ -0,0 +1,28 @@
+module Data.SpirV.Reflect.TypeDescription where
+
+import Data.Text (Text)
+import Data.Vector (Vector)
+import GHC.Generics (Generic)
+import Data.Word (Word32)
+
+import Data.SpirV.Reflect.Enums qualified as Enums
+import Data.SpirV.Reflect.Traits qualified as Traits
+
+data TypeDescription = TypeDescription
+  { id                 :: Maybe Word32
+  , op                 :: Maybe Enums.Op
+  , type_name          :: Maybe Text
+  , struct_member_name :: Maybe Text
+  , storage_class      :: Enums.StorageClass
+  , type_flags         :: Enums.TypeFlags
+  , traits             :: Maybe Traits
+  , members            :: Vector TypeDescription
+  }
+  deriving (Eq, Show, Generic)
+
+data Traits = Traits
+  { numeric :: Traits.Numeric
+  , image   :: Traits.Image
+  , array   :: Traits.Array
+  }
+  deriving (Eq, Show, Generic)
diff --git a/spirv-reflect-types.cabal b/spirv-reflect-types.cabal
new file mode 100644
--- /dev/null
+++ b/spirv-reflect-types.cabal
@@ -0,0 +1,73 @@
+cabal-version: 1.12
+
+-- This file has been generated from package.yaml by hpack version 0.34.4.
+--
+-- see: https://github.com/sol/hpack
+
+name:           spirv-reflect-types
+version:        0.1
+synopsis:       Data types from spirv-reflect tool.
+category:       Graphics
+author:         IC Rainbow
+maintainer:     ic.rbow@gmail.com
+copyright:      2022 IC Rainbow
+license:        BSD3
+license-file:   LICENSE
+build-type:     Simple
+extra-source-files:
+    ChangeLog.md
+
+source-repository head
+  type: git
+  location: https://gitlab.com/dpwiz/spirv-reflect
+
+library
+  exposed-modules:
+      Data.SpirV.Reflect.BlockVariable
+      Data.SpirV.Reflect.DescriptorBinding
+      Data.SpirV.Reflect.DescriptorSet
+      Data.SpirV.Reflect.Enums
+      Data.SpirV.Reflect.Enums.Common
+      Data.SpirV.Reflect.Enums.DecorationFlags
+      Data.SpirV.Reflect.Enums.DescriptorType
+      Data.SpirV.Reflect.Enums.Format
+      Data.SpirV.Reflect.Enums.Generator
+      Data.SpirV.Reflect.Enums.ModuleFlags
+      Data.SpirV.Reflect.Enums.ResourceFlags
+      Data.SpirV.Reflect.Enums.Result
+      Data.SpirV.Reflect.Enums.ShaderStage
+      Data.SpirV.Reflect.Enums.SpirvBuiltin
+      Data.SpirV.Reflect.Enums.SpirvDim
+      Data.SpirV.Reflect.Enums.SpirvImageFormat
+      Data.SpirV.Reflect.Enums.SpirvOp
+      Data.SpirV.Reflect.Enums.SpirvStorageClass
+      Data.SpirV.Reflect.Enums.TypeFlags
+      Data.SpirV.Reflect.InterfaceVariable
+      Data.SpirV.Reflect.Module
+      Data.SpirV.Reflect.Traits
+      Data.SpirV.Reflect.TypeDescription
+  other-modules:
+      Paths_spirv_reflect_types
+  hs-source-dirs:
+      lib
+  default-extensions:
+      ApplicativeDo
+      BlockArguments
+      DeriveGeneric
+      DerivingStrategies
+      DuplicateRecordFields
+      FlexibleContexts
+      GeneralizedNewtypeDeriving
+      ImportQualifiedPost
+      LambdaCase
+      OverloadedStrings
+      PatternSynonyms
+      RecordWildCards
+      StrictData
+      TypeApplications
+  build-depends:
+      base >=4.7 && <5
+    , containers
+    , text
+    , vector
+  default-language: Haskell2010
