def op_prepare_after_hook(
        self,
        op: Callable,
        outputs: Any,
        args: Tuple[Any, ...],
        global_op_idx: List[int],
    ) -> Any:
        """
        This function is called after an op call on a prepared model.
        * observe the output, if needed, which only works for OpQuantizeabilityType.QUANTIZEABLE.
        TODO: remove this after all ops support INT8->FP32.
        """
        seen_q_op_info = self._get_cur_seen_q_op_info()

        def _observer_output(output, tensor_info):
            tensor_id = tensor_info.id
            if str(tensor_id) in self.tensor_id_to_observer:
                observer = self.tensor_id_to_observer[str(tensor_id)]
                set_tensor_info_dtype(tensor_info, observer)
                observer(output.float())

        if isinstance(outputs, torch.Tensor):
            tensor_info = seen_q_op_info.output_tensor_infos[0]
            _observer_output(outputs, tensor_info)
        elif isinstance(outputs, tuple):
            idx = 0
            for element in outputs:
                # only do observer for tensor type.
                if isinstance(element, torch.Tensor):
                    tensor_info = seen_q_op_info.output_tensor_infos[idx]
                    _observer_output(element, tensor_info)
                    idx += 1
        return outputs

        This function is called after an op call on a prepared model.
        * observe the output, if needed, which only works for OpQuantizeabilityType.QUANTIZEABLE.
        TODO: remove this after all ops support INT8->FP32.
        
intel_extension_for_pytorch/quantization/_quantization_state.py