# Copyright 2024 Apheleia
#
# Description:
# Apheleia Verification Library Scoreboard
from .component import Component
from .list import List
[docs]
class Scoreboard(Component):
[docs]
def __init__(self, name: str, parent: Component) -> None:
"""
Initializes the scoreboard component.
:param name: Name of the scoreboard.
:type name: str
:param parent: Parent component.
:type parent: Component
"""
super().__init__(name, parent)
self.before_port = List()
self.before_item = None
self.after_port = List()
self.after_item = None
self.compare_count = 0
self.min_compare_count = 0
self.verbose = False
[docs]
def set_verbose(self, verbose: bool) -> None:
"""
Sets the verbosity of the scoreboard.
:param verbose: Verbosity flag.
"""
self.verbose = verbose
[docs]
def set_min_compare_count(self, count: int) -> None:
"""
Sets the minimum number of comparisons required.
:param count: Minimum number of comparisons.
"""
self.min_compare_count = count
[docs]
async def run_phase(self) -> None:
"""
Runs the scoreboard phase.
"""
while True:
self.before_item = await self.before_port.blocking_pop()
self.after_item = await self.after_port.blocking_pop()
self.before_item.compare(self.after_item, verbose=self.verbose, bidirectional=True)
self.compare_count += 1
self.after_item = None
self.before_item = None
[docs]
async def report_phase(self) -> None:
"""
Reports the results of the scoreboard.
"""
if len(self.before_port) + int(self.before_item is not None) > 0 or len(
self.after_port
) + int(self.after_item is not None):
self.error(
f"Outstanding items: before_port={len(self.before_port) + int(self.before_item is not None)} after_port={len(self.after_port) + int(self.after_item is not None)}"
)
if self.compare_count < self.min_compare_count:
self.error(
f"Not enough items compared: {self.compare_count} < {self.min_compare_count}"
)
if self.verbose:
self.info(f"Compared {self.compare_count} items")
__all__ = ["Scoreboard"]