def METHOD_NAME(self, sdfg, state):
    """
    :return: buffer, count, mpi_dtype, req of the input data
    """
    buffer, dest, tag, req = None, None, None, None
    for e in state.in_edges(self):
        if e.dst_conn == "_buffer":
            buffer = sdfg.arrays[e.data.data]
        if e.dst_conn == "_dest":
            dest = sdfg.arrays[e.data.data]
        if e.dst_conn == "_tag":
            tag = sdfg.arrays[e.data.data]
    for e in state.out_edges(self):
        if e.src_conn == "_request":
            req = sdfg.arrays[e.data.data]
    # TODO: Should we expect any integer type for dst/tag and cast to int32 later?.
    # TODO: Investigate further in the future.
    count_str = "XXX"
    for _, _, _, dst_conn, data in state.in_edges(self):
        if dst_conn == '_buffer':
            dims = [str(e) for e in data.subset.size_exact()]
            count_str = "*".join(dims)
            # compute buffer offset
            minelem = data.subset.min_element()
            dims_data = sdfg.arrays[data.data].strides
            buffer_offsets = []
            for idx, m in enumerate(minelem):
                buffer_offsets += [(str(m) + "*" + str(dims_data[idx]))]
            buffer_offset = "+".join(buffer_offsets)
            # create a ddt which describes the buffer layout IFF the sent data is not contiguous
            ddt = None
            if dace.libraries.mpi.utils.is_access_contiguous(data, sdfg.arrays[data.data]):
                pass
            else:
                ddt = dace.libraries.mpi.utils.create_vector_ddt(data, sdfg.arrays[data.data])
    return (buffer, count_str, buffer_offset, ddt), dest, tag, req