docs: def _merge_cfgnodes(self, cfgnode_0, cfgnode_1):
          """
          Merge two adjacent CFGNodes into one.
  
          :param CFGNode cfgnode_0:   The first CFGNode.
          :param CFGNode cfgnode_1:   The second CFGNode.
          :return:                    None
          """
  
          assert cfgnode_0.addr + cfgnode_0.size == cfgnode_1.addr
          addr0, addr1 = cfgnode_0.addr, cfgnode_1.addr
          new_node = cfgnode_0.merge(cfgnode_1)
  
          # Update the graph and the nodes dict accordingly
          if addr1 in self._nodes_by_addr:
              self._nodes_by_addr[addr1].remove(cfgnode_1)
              if not self._nodes_by_addr[addr1]:
                  del self._nodes_by_addr[addr1]
          del self._nodes[cfgnode_1.block_id]
  
          self._nodes_by_addr[addr0].remove(cfgnode_0)
          if not self._nodes_by_addr[addr0]:
              del self._nodes_by_addr[addr0]
          del self._nodes[cfgnode_0.block_id]
  
          in_edges = list(self.graph.in_edges(cfgnode_0, data=True))
          out_edges = list(self.graph.out_edges(cfgnode_1, data=True))
  
          self.graph.remove_node(cfgnode_0)
          self.graph.remove_node(cfgnode_1)
  
          self.graph.add_node(new_node)
          for src, _, data in in_edges:
              self.graph.add_edge(src, new_node, **data)
          for _, dst, data in out_edges:
              self.graph.add_edge(new_node, dst, **data)
  
          # Put the new node into node dicts
          self._nodes[new_node.block_id] = new_node
          self._nodes_by_addr[addr0].append(new_node)