def slicify(slc, dim):
    """
    Force a slice to have defined start, stop, and step from a known dim.
    Start and stop will always be positive. Step may be negative.

    There is an exception where a negative step overflows the stop needs to have
    the default value set to -1. This is the only case of a negative start/stop
    value.

    Parameters
    ----------
    slc : slice or int
        The slice to modify, or int to convert to a slice

    dim : tuple
        Bound for slice
    """
    if isinstance(slc, slice):
        start = 0 if slc.start is None else slc.start
        stop = dim if slc.stop is None else slc.stop
        step = 1 if slc.step is None else slc.step
        if start < 0:
            start += dim
        if stop < 0:
            stop += dim
        if step > 0:
            if start < 0:
                start = 0
            if stop > dim:
                stop = dim
        else:
            if stop < 0:
                stop = -1
            if start > dim:
                start = dim - 1
        return slice(start, stop, step)
    elif isinstance(slc, int):
        if slc < 0:
            slc += dim
        return slice(slc, slc + 1, 1)
    else:
        raise ValueError('Type for slice %s not recongized' % type(slc))
