code: def safe_to_write(self, regs, i=0, end_=0):
          
          if is_register(regs):
              regs = set(single_registers(regs))
          else:
              regs = set(single_registers(x) for x in regs)
          return not regs.intersection(self.requires(i, end_))
docs: Given a list of registers (8 or 16 bits) returns a list of them
          that are safe to modify from the given index until the position given
          which, if omitted, defaults to the end of the block.
          :param regs: register or iterable of registers (8 or 16 bit one)
          :param i: initial position of the block to examine
          :param end_: final position to examine
          :returns: registers safe to write