def _propagate_range_resolution(self, in_dtype: type, dtype_chain: Tuple[type]):
        """
        Given an input type ``in_dtype``, and a chain of casting, return the resulting output data range and resolution.

        For example, ``in_dtype = fp32`` and ``dtype_chain = [int8, int32]``. This means an input data with type ``fp32``,
        is propagated through ``cast(dtype="int8")`` and ``cast(dtype="int32")`` in order.

        1. The input fp32 data range is ``[-3.4e+38, 3.4e+38]`` with resolution ``1e-06``.
        2. After the first ``cast(dtype="int8")`` downcast, the range becomes ``[-128, 127]`` with resolution ``1``.
        3. Even the ``int32`` has a larger range, the resulting range is still capped to ``[-128, 127]``.

        For the above example, this function returns range of ``[-128, 127]`` and resolution ``1``.
        """
        assert isinstance(dtype_chain, tuple)
        cur_range, cur_resolution = builtin_to_range(in_dtype), builtin_to_resolution(in_dtype)
        for v in dtype_chain:
            tmp_range, tmp_resolution = builtin_to_range(v), builtin_to_resolution(v)
            cur_range = RangeTuple(
                max(cur_range.low, tmp_range.low), min(cur_range.high, tmp_range.high)
            )
            cur_resolution = max(cur_resolution, tmp_resolution)
        return cur_range, cur_resolution

        Given an input type ``in_dtype``, and a chain of casting, return the resulting output data range and resolution.

        For example, ``in_dtype = fp32`` and ``dtype_chain = [int8, int32]``. This means an input data with type ``fp32``,
        is propagated through ``cast(dtype="int8")`` and ``cast(dtype="int32")`` in order.

        1. The input fp32 data range is ``[-3.4e+38, 3.4e+38]`` with resolution ``1e-06``.
        2. After the first ``cast(dtype="int8")`` downcast, the range becomes ``[-128, 127]`` with resolution ``1``.
        3. Even the ``int32`` has a larger range, the resulting range is still capped to ``[-128, 127]``.

        For the above example, this function returns range of ``[-128, 127]`` and resolution ``1``.
        
coremltools/converters/mil/mil/passes/defs/optimize_repeat_ops.py