docs: def isa(mnemonic: str, opcode: int, funct3: int=None, funct7: int=None, *, variant=RV32I, extension=None):
      """
      Decorator for the instructions. The decorator contains the static information for the instructions, in particular
      the encoding parameters and the assembler mnemonic.
  
      :param mnemonic: Assembler mnemonic
      :param opcode: Opcode of this instruction
      :param funct3: 3 bit function code on bits 14 to 12 (R-, I-, S- and B-type)
      :param funct7: 7 bit function code on bits 31 to 25 (R-type)
      :return: Wrapper class that overwrites the actual definition and contains static data
      """
      def wrapper(wrapped):
          """Get wrapper"""
          class WrappedClass(wrapped):
              """Generic wrapper class"""
              _mnemonic = mnemonic
              _opcode = opcode
              _funct3 = funct3
              _funct7 = funct7
              _variant = variant
              _extension = extension
  
              @staticmethod
              def _match(machinecode: int):
                  """Try to match a machine code to this instruction"""
                  f3 = (machinecode >> 12) & 0x7
                  f7 = (machinecode >> 25) & 0x7f
                  if funct3 is not None and f3 != funct3:
                      return False
                  if funct7 is not None and f7 != funct7:
                      return False
                  return True
  
          WrappedClass.__name__ = wrapped.__name__
          WrappedClass.__module__ = wrapped.__module__
          WrappedClass.__qualname__ = wrapped.__qualname__
          return WrappedClass
      return wrapper