Source code for chipscopy.api.ibert.ibert

# Copyright (C) 2021-2022, Xilinx, Inc.
# Copyright (C) 2022-2023, Advanced Micro Devices, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from __future__ import annotations

from rich.tree import Tree
from typing import TYPE_CHECKING

from chipscopy.api import CoreType
from chipscopy.api._detail.debug_core import DebugCore
from chipscopy.api.containers import QueryList
from chipscopy.api.ibert.aliases import GT_GROUP_KEY, HANDLE_NAME, IBERT_KEY, DISPLAY_NAME
from chipscopy.api.ibert.gt_group import GTGroup
from chipscopy.api.report import report_hierarchy
from chipscopy.utils import deprecated_api
from typing_extensions import Final, final

if TYPE_CHECKING:  # pragma: no cover
    from chipscopy.client.ibert_core_client import IBERTCoreClient  # noqa


[docs]@final class IBERT(DebugCore["IBERTCoreClient"]): """ Main API class to use IBERT (Integrated Bit Error Ratio Tester) debug core. """ def __init__(self, ibert_tcf_node): super(IBERT, self).__init__(CoreType.IBERT, ibert_tcf_node) _, core_info = self.core_tcf_node.initialize_architecture().popitem() self._gt_groups_discovery_complete: bool = False self.type: Final[str] = IBERT_KEY """Serial object type""" self.children: QueryList[GTGroup] = QueryList() """Children of IBERT""" self.name: str = core_info[DISPLAY_NAME] """Name of the IBERT core""" self.handle = core_info[HANDLE_NAME] """Handle from cs_server""" # This is used by the filter_by method in QueryList self.filter_by = {"name": self.name, "type": self.type, "handle": self.handle} def __repr__(self) -> str: return self.name def __rich_tree__(self): root = Tree(self.name) for child in self.children: root.add(child.__rich_tree__()) return root @property def gt_groups(self) -> QueryList[GTGroup]: """GT Group children of the IBERT core""" self.discover_gt_groups() return self.children.filter_by(type=GT_GROUP_KEY)
[docs] def discover_gt_groups(self, *, include_uninstantiated: bool = False): """ Discover all GT Groups that are instantiated by the design. Args: include_uninstantiated (bool): If you wish to include un-instantiated GT Groups in the discovery process, set this to 'True'. Returns: None """ if self._gt_groups_discovery_complete: return gt_group_handles = self.core_tcf_node.discover_gt_groups(include_uninstantiated) if isinstance(gt_group_handles, str): gt_group_handles = [gt_group_handles] for handle in gt_group_handles: obj_info = self.core_tcf_node.get_obj_info(handle) self.children.append(GTGroup(obj_info, self, self.core_tcf_node)) self._gt_groups_discovery_complete = True
[docs] def reset(self): """ Reset all RXs, TXs and PLLs in the GT Groups """ for gt_group in self.gt_groups: gt_group.reset()
@deprecated_api(release="2021.1", replacement="report_hierarchy(<Any serial object>)") def print_hierarchy(self): """ Prints hierarchy of IBERTs child objects like the GT Group, GT, PLL etc to stdout. The format is similar to the output of the unix command - `tree` """ report_hierarchy(self)