def add_bpt_mem(self,
                    address,
                    memory_space=None,
                    on_read=True,
                    on_write=True,
                    on_modify=True):
        """
        Set a new breakpoint, which will be hit when a memory location is accessed

        :param address:
            The address to set the breakpoint on

        :param memory_space:
            The name of the memory space that ``address`` is in.
            If None, the current memory space of the core is used

        :param on_read:
            If True, the breakpoint will be triggered when the memory location
            is read from.

        :param on_write:
            If True, the breakpoint will be triggered when the memory location
            is written to.

        :param on_modify:
            If True, the breakpoint will be triggered when the memory location
            is modified.
        """

        space = self._get_address_space(memory_space)

        cadi_address = CADI.CADIAddrComplete(
            CADI.CADI_NO_OVERLAY, CADI.CADIAddr(space.memSpaceId, address))

        trigger_type = 0
        if on_read:
            trigger_type |= CADI.CADI_BPT_TRIGGER_ON_READ
        if on_write:
            trigger_type |= CADI.CADI_BPT_TRIGGER_ON_WRITE
        if on_modify:
            trigger_type |= CADI.CADI_BPT_TRIGGER_ON_MODIFY

        if trigger_type == 0:
            raise ValueError(
                "At least one of on_read, on_write and on_modify must be True")

        request = CADI.CADIBptRequest(enabled_par=1,
                                      type_par=CADI.CADI_BPT_MEMORY,
                                      address_par=cadi_address,
                                      triggerType_par=trigger_type)
        bpt = Breakpoint(self, self.__cadi, request)
        self.breakpoints[bpt.number] = bpt
        return self.breakpoints[bpt.number]
    def add_bpt_reg(self,
                    reg_name,
                    on_read=True,
                    on_write=True,
                    on_modify=True):
        """
        Set a new breakpoint, which will be hit when a register is accessed

        :param reg_name:
            The name of the register to set the breakpoint on.
            The name can be in one of the following formats:
                * ``<group>.<register>``
                * ``<group>.<register>.<field>``
                * ``<register>``
                * ``<register>.<field>``
            
            The last two forms can only be used if the register name is unambiguous

        :param on_read:
            If True, the breakpoint will be triggered when the register is read from.

        :param on_write:
            If True, the breakpoint will be triggered when the register is written to.

        :param on_modify:
            If True, the breakpoint will be triggered when the register is modified.
        """

        # No ARM models support register breakpoints (as of Apr 2013), so this is untested
        register = self._get_register_by_name(reg_name)

        trigger_type = 0
        if on_read:
            trigger_type |= CADI.CADI_BPT_TRIGGER_ON_READ
        if on_write:
            trigger_type |= CADI.CADI_BPT_TRIGGER_ON_WRITE
        if on_modify:
            trigger_type |= CADI.CADI_BPT_TRIGGER_ON_MODIFY

        if trigger_type == 0:
            raise ValueError(
                "At least one of on_read, on_write and on_modify must be True")

        request = CADI.CADIBptRequest(enabled_par=1,
                                      type_par=CADI.CADI_BPT_REGISTER,
                                      regNumber_par=register._info.regNumber,
                                      triggerType_par=trigger_type)

        bpt = Breakpoint(self, self.__cadi, request)
        self.breakpoints[bpt.number] = bpt
        return self.breakpoints[bpt.number]
    def add_bpt_prog(self, address, memory_space=None):
        """
        Set a new breakpoint, which will be hit when program execution reaches a memory address

        :param address:
            The address to set the breakpoint on

        :param memory_space:
            The name of the memory space that ``address`` is in.
            If None, the current memory space of the core is used
        """

        space = self._get_address_space(memory_space)

        cadi_address = CADI.CADIAddrComplete(
            CADI.CADI_NO_OVERLAY, CADI.CADIAddr(space.memSpaceId, address))
        request = CADI.CADIBptRequest(enabled_par=1,
                                      type_par=CADI.CADI_BPT_PROGRAM,
                                      address_par=cadi_address)
        bpt = Breakpoint(self, self.__cadi, request)
        self.breakpoints[bpt.number] = bpt
        return self.breakpoints[bpt.number]