code: def block_partition(block, i):
      
      i += 1
      new_block = BasicBlock(block.asm[i:])
      block.mem = block.mem[:i]
      block.asm = block.asm[:i]
      block.update_labels()
      new_block.update_labels()
  
      new_block.goes_to = block.goes_to
      block.goes_to = IdentitySet()
  
      new_block.label_goes = block.label_goes
      block.label_goes = []
  
      new_block.next = new_block.original_next = block.original_next
      new_block.prev = block
      new_block.add_comes_from(block)
  
      if new_block.next is not None:
          new_block.next.prev = new_block
          new_block.next.add_comes_from(new_block)
          new_block.next.delete_from(block)
  
      block.next = block.original_next = new_block
      block.update_next_block()
      block.add_goes_to(new_block)
  
      return block, new_block
docs: Returns two blocks, as a result of partitioning the given one at
      i-th instruction.