def _generate_grid_points(attrs, index):
    """
    Make implicit grid point parameters explicit.

    Parameters
    ----------
    attrs : list or tuple
        The attributes of the grid.
    index : int
        The index of the first grid point.

    Returns
    -------
    points : tuple
        The grid points.

    See Also
    --------
    _expand_buffers : Function using the present function.

    """
    points = []
    spacing = attrs['pointSpacing']
    x_start = attrs['xCenter'] - (attrs['xPoints'] - 1) / 2 * spacing
    y_start = attrs['yCenter'] - (attrs['yPoints'] - 1) / 2 * spacing
    x_dir = slice(None, None, 1 if attrs['xDirection'] == 'trace' else -1)
    y_dir = slice(None, None, 1 if attrs['yDirection'] == 'down' else -1)
    for y_index in range(attrs['yPoints']).__getitem__(y_dir):
        points.append([])
        y = y_start + y_index * spacing
        for x_index in range(attrs['xPoints']).__getitem__(x_dir):
            x = x_start + x_index * spacing
            point = {'index': index, 'xCoordinate': x, 'yCoordinate': y}
            points[-1].append({'attrs': point})
            index = index + 1
        points[-1] = points[-1].__getitem__(x_dir)
    points = points.__getitem__(y_dir)
    return points
