diff --git a/chipflow_lib/__init__.py b/chipflow_lib/__init__.py index 78ef2ec4..03ee8aca 100644 --- a/chipflow_lib/__init__.py +++ b/chipflow_lib/__init__.py @@ -68,4 +68,4 @@ def _parse_config() -> 'Config': except FileNotFoundError: raise ChipFlowError(f"Config file not found. I expected to find it at {config_file}") except tomli.TOMLDecodeError as e: - raise ChipFlowError(f"TOML Error found when loading {config_file}: {e.msg} at line {e.lineno}, column {e.colno}") + raise ChipFlowError(f"{config_file} has a formatting error: {e.msg} at line {e.lineno}, column {e.colno}") diff --git a/chipflow_lib/_doit.py b/chipflow_lib/_doit.py new file mode 100644 index 00000000..885126b6 --- /dev/null +++ b/chipflow_lib/_doit.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 *-* +# SPDX-License-Identifier: BSD-2-Clause + +from typing import List, Tuple, Callable, TypeVar, Generic +from typing_extensions import TypedDict, NotRequired + +T=TypeVar('T') +class TaskParams(TypedDict, Generic[T]): + name: str + default: T + short: NotRequired[str] + long: NotRequired[str] + type: NotRequired[Callable[[T], str]] + choices: NotRequired[List[Tuple[str, str]]] + help: NotRequired[str] + inverse: NotRequired[str] + + diff --git a/chipflow_lib/_pin_lock.py b/chipflow_lib/_pin_lock.py index 247a0d77..cee426f4 100644 --- a/chipflow_lib/_pin_lock.py +++ b/chipflow_lib/_pin_lock.py @@ -6,7 +6,8 @@ from pprint import pformat from . import _parse_config, _ensure_chipflow_root, ChipFlowError -from .platforms._internal import top_components, LockFile, PACKAGE_DEFINITIONS +from .platforms._utils import top_components, LockFile +from .platforms._packages import PACKAGE_DEFINITIONS # logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) logger = logging.getLogger(__name__) diff --git a/chipflow_lib/cli.py b/chipflow_lib/cli.py index 0a381191..05de638b 100644 --- a/chipflow_lib/cli.py +++ b/chipflow_lib/cli.py @@ -25,6 +25,7 @@ class UnexpectedError(ChipFlowError): DEFAULT_STEPS = { "silicon": "chipflow_lib.steps.silicon:SiliconStep", "sim": "chipflow_lib.steps.sim:SimStep", + "software": "chipflow_lib.steps.software:SoftwareStep" } @@ -36,13 +37,16 @@ def run(argv=sys.argv[1:]): if config.chipflow.steps: steps = DEFAULT_STEPS |config.chipflow.steps - for step_name, step_reference in steps.items(): - step_cls = _get_cls_by_reference(step_reference, context=f"step `{step_name}`") - try: - commands[step_name] = step_cls(config) - except Exception: - raise ChipFlowError(f"Encountered error while initializing step `{step_name}` " - f"using `{step_reference}`") + else: + steps = DEFAULT_STEPS + + for step_name, step_reference in steps.items(): + step_cls = _get_cls_by_reference(step_reference, context=f"step `{step_name}`") + try: + commands[step_name] = step_cls(config) + except Exception: + raise ChipFlowError(f"Encountered error while initializing step `{step_name}` " + f"using `{step_reference}`") parser = argparse.ArgumentParser( prog="chipflow", @@ -109,4 +113,6 @@ def run(argv=sys.argv[1:]): if hasattr(args, "action"): cmd += f" {args.action}" print(f"Error while executing `{cmd}`: {e}") + print("Caused by:") + traceback.print_exception(e.__cause__) exit(1) diff --git a/chipflow_lib/config_models.py b/chipflow_lib/config_models.py index bbfc1f21..6d523943 100644 --- a/chipflow_lib/config_models.py +++ b/chipflow_lib/config_models.py @@ -1,14 +1,47 @@ # SPDX-License-Identifier: BSD-2-Clause -from typing import Dict, Optional, Any, List +from enum import Enum +from typing import Dict, Optional, Any, List, Annotated -from pydantic import BaseModel +from pydantic import ( + BaseModel, PlainSerializer, WrapValidator + ) -from .platforms._internal import PACKAGE_DEFINITIONS, Process, Voltage +from ._appresponse import AppResponseModel, OmitIfNone +class Process(Enum): + """ + IC manufacturing process + """ + #: Skywater foundry open-source 130nm process + SKY130 = "sky130" + #: GlobalFoundries open-source 130nm process + GF180 = "gf180" + #: Pragmatic Semiconductor FlexIC process (old) + HELVELLYN2 = "helvellyn2" + #: GlobalFoundries 130nm BCD process + GF130BCD = "gf130bcd" + #: IHP open source 130nm SiGe Bi-CMOS process + IHP_SG13G2 = "ihp_sg13g2" -def known_package(package: str): - if package not in PACKAGE_DEFINITIONS.keys(): - raise ValueError(f"{package} is not a valid package type. Valid package types are {PACKAGE_DEFINITIONS.keys()}") + def __str__(self): + return f'{self.value}' + + + +Voltage = Annotated[ + float, + PlainSerializer(lambda x: f'{x:.1e}V', return_type=str), + WrapValidator(lambda v, h: h(v.strip('Vv ') if isinstance(v, str) else h(v))) + ] + + +class VoltageRange(AppResponseModel): + """ + Models a voltage range for a power domain or IO + """ + min: Annotated[Optional[Voltage], OmitIfNone()] = None + max: Annotated[Optional[Voltage], OmitIfNone()] = None + typical: Annotated[Optional[Voltage], OmitIfNone()] = None class SiliconConfig(BaseModel): @@ -22,6 +55,13 @@ class SiliconConfig(BaseModel): class SimulationConfig(BaseModel): num_steps: int = 3000000 +class CompilerConfig(BaseModel): + cpu: str + abi: str + +class SoftwareConfig(BaseModel): + riscv: CompilerConfig = CompilerConfig(cpu="baseline_rv32-a-c-d", abi="ilp32") + class ChipFlowConfig(BaseModel): """Root configuration for chipflow.toml.""" project_name: str @@ -29,6 +69,7 @@ class ChipFlowConfig(BaseModel): steps: Optional[Dict[str, str]] = None silicon: Optional[SiliconConfig] = None simulation: SimulationConfig = SimulationConfig() + software: SoftwareConfig = SoftwareConfig() clock_domains: Optional[List[str]] = None diff --git a/chipflow_lib/platforms/__init__.py b/chipflow_lib/platforms/__init__.py index 4d98e554..09576053 100644 --- a/chipflow_lib/platforms/__init__.py +++ b/chipflow_lib/platforms/__init__.py @@ -8,6 +8,7 @@ from .silicon import SiliconPlatformPort, SiliconPlatform from .sim import SimPlatform +from ._software import SoftwarePlatform from ._utils import ( IO_ANNOTATION_SCHEMA, IOSignature, IOModel, IOTripPoint, IOModelOptions, OutputIOSignature, InputIOSignature, BidirIOSignature, @@ -16,15 +17,15 @@ from ._sky130 import Sky130DriveMode from ._signatures import ( JTAGSignature, SPISignature, I2CSignature, UARTSignature, GPIOSignature, QSPIFlashSignature, - attach_simulation_data + attach_data, SoftwareDriverSignature, SoftwareBuild ) __all__ = ['IO_ANNOTATION_SCHEMA', 'IOSignature', 'IOModel', 'IOModelOptions', 'IOTripPoint', 'OutputIOSignature', 'InputIOSignature', 'BidirIOSignature', 'SiliconPlatformPort', 'SiliconPlatform', - 'SimPlatform', + 'SimPlatform', 'SoftwarePlatform', 'JTAGSignature', 'SPISignature', 'I2CSignature', 'UARTSignature', 'GPIOSignature', 'QSPIFlashSignature', - 'attach_simulation_data', + 'attach_data', 'SoftwareDriverSignature', 'SoftwareBuild', 'Sky130DriveMode', 'PACKAGE_DEFINITIONS'] diff --git a/chipflow_lib/platforms/_annotate.py b/chipflow_lib/platforms/_annotate.py index 2dbeef1f..a611ddfb 100644 --- a/chipflow_lib/platforms/_annotate.py +++ b/chipflow_lib/platforms/_annotate.py @@ -1,55 +1,70 @@ + +from collections.abc import Generator from types import MethodType -import pydantic -from typing import TypeVar +from typing import ( + Tuple, TypeVar, +) from typing_extensions import is_typeddict -_T_TypedDict = TypeVar('_T_TypedDict') -def amaranth_annotate(modeltype: type['_T_TypedDict'], schema_id: str, member='__chipflow_annotation__', decorate_object = False): +import pydantic +from amaranth import Fragment +from amaranth.lib import meta, wiring + + +_T_TypedDict = TypeVar('_T_TypedDict') +def amaranth_annotate(modeltype: type[_T_TypedDict], schema_id: str, member: str = '__chipflow_annotation__', decorate_object = False): + # a bit of nastyness as can't set TypedDict as a bound yet if not is_typeddict(modeltype): - raise TypeError(f'''amaranth_annotate must be passed a TypedDict, not {modeltype}''') + raise TypeError(f"amaranth_annotate must be passed a TypedDict, not {modeltype}") # interesting pydantic issue gets hit if arbitrary_types_allowed is False if hasattr(modeltype, '__pydantic_config__'): - config = getattr(modeltype, '__pydantic_config__') + config: pydantic.ConfigDict = getattr(modeltype, '__pydantic_config__') config['arbitrary_types_allowed'] = True else: config = pydantic.ConfigDict() config['arbitrary_types_allowed'] = True setattr(modeltype, '__pydantic_config__', config) + PydanticModel = pydantic.TypeAdapter(modeltype) def annotation_schema(): schema = PydanticModel.json_schema() - schema['$schema'] = 'https://json-schema.org/draft/2020-12/schema' + schema['$schema'] = "https://json-schema.org/draft/2020-12/schema" schema['$id'] = schema_id return schema - class Annotation: - 'Generated annotation class' + class Annotation(meta.Annotation): + "Generated annotation class" schema = annotation_schema() def __init__(self, parent): self.parent = parent - def origin(self): + @property + def origin(self): # type: ignore return self.parent - def as_json(self): - return PydanticModel.dump_python(getattr(self.parent, member)) + def as_json(self): # type: ignore + # TODO: this is slow, but atm necessary as dump_python doesn't do the appropriate + # transformation of things like PosixPath. Figure out why, maybe log issue/PR with + # pydantic + # return json.loads(PydanticModel.dump_json(getattr(self.parent, member))) + return PydanticModel.dump_python(getattr(self.parent, member), mode='json') def decorate_class(klass): if hasattr(klass, 'annotations'): old_annotations = klass.annotations else: old_annotations = None - - def annotations(self, obj): + def annotations(self, obj, /): # type: ignore if old_annotations: - annotations = old_annotations(self, obj) + annotations = old_annotations(self, obj) # type: ignore else: annotations = super(klass, obj).annotations(obj) annotation = Annotation(self) - return annotations + (annotation,) + return annotations + (annotation,) # type: ignore + klass.annotations = annotations return klass @@ -60,15 +75,15 @@ def decorate_obj(obj): else: old_annotations = None - def annotations(self = None, origin = None): + def annotations(self, origin , /): # type: ignore if old_annotations: annotations = old_annotations(origin) else: annotations = super(obj.__class__, obj).annotations(obj) annotation = Annotation(self) - return annotations + (annotation,) + return annotations + (annotation,) # type: ignore - setattr(obj, 'annotations', MethodType(annotations, obj)) + setattr(obj, 'annotations', MethodType(annotations, obj)) return obj if decorate_object: @@ -76,3 +91,30 @@ def annotations(self = None, origin = None): else: return decorate_class + +def submodule_metadata(fragment: Fragment, component_name: str, recursive=False) -> Generator[Tuple[wiring.Component, str| tuple, dict]]: + """ + Generator that finds `component_name` in `fragment` and + then yields the ``wiring.Component``s of that component's submodule, along with their names and metadata + + Can only be run once for a given component (or its children) + + If recursive = True, then name is a tuple of the heirarchy of names + otherwise, name is the string name of the first level component + """ + + subfrag = fragment.find_subfragment(component_name) + design = subfrag.prepare() + for k,v in design.elaboratables.items(): + full_name:tuple = design.fragments[design.elaboratables[k]].name + if len(full_name) > 1: # ignore the top component + if recursive: + name = full_name[1:] + else: + if len(full_name) != 2: + continue + name = full_name[1] + if isinstance(k, wiring.Component): + metadata = k.metadata.as_json()['interface'] + yield k, name, metadata + diff --git a/chipflow_lib/platforms/_internal.py b/chipflow_lib/platforms/_internal.py deleted file mode 100644 index 631d04af..00000000 --- a/chipflow_lib/platforms/_internal.py +++ /dev/null @@ -1,12 +0,0 @@ -from .silicon import * -from .sim import * -from ._utils import * -from ._packages import * -__all__ = ['IO_ANNOTATION_SCHEMA', 'IOSignature', 'IOModel', - 'OutputIOSignature', 'InputIOSignature', 'BidirIOSignature', - 'load_pinlock', "PACKAGE_DEFINITIONS", 'top_components', 'LockFile', - 'Package', 'PortMap', 'PortDesc', 'Process', - 'GAPackageDef', 'QuadPackageDef', 'BareDiePackageDef', 'BasePackageDef', - 'BringupPins', 'JTAGPins', 'PowerPins', - 'SiliconPlatformPort', 'SiliconPlatform', - 'SimPlatform'] diff --git a/chipflow_lib/platforms/_openframe.py b/chipflow_lib/platforms/_openframe.py index b68a11ca..7b057bcb 100644 --- a/chipflow_lib/platforms/_openframe.py +++ b/chipflow_lib/platforms/_openframe.py @@ -1,6 +1,7 @@ from typing import List, NamedTuple, Optional, Literal -from ._utils import Voltage, PowerPins, LinearAllocPackageDef, BringupPins +from ._utils import PowerPins, LinearAllocPackageDef, BringupPins +from ..config_models import Voltage class OFPin(NamedTuple): pin: int diff --git a/chipflow_lib/platforms/_signatures.py b/chipflow_lib/platforms/_signatures.py index fdfda458..4b382067 100644 --- a/chipflow_lib/platforms/_signatures.py +++ b/chipflow_lib/platforms/_signatures.py @@ -1,25 +1,103 @@ # SPDX-License-Identifier: BSD-2-Clause import re -from typing import List, Tuple, Any -from typing_extensions import Unpack, TypedDict +import sys + +from dataclasses import dataclass +from pathlib import Path +from typing import ( + List, Tuple, Any, Protocol, runtime_checkable, + Literal, TypeVar, Generic, Annotated + ) + +from typing_extensions import Unpack, TypedDict, NotRequired from amaranth.lib import wiring from amaranth.lib.wiring import Out +from pydantic import PlainSerializer, WithJsonSchema, WrapValidator +from .. import _ensure_chipflow_root from ._utils import InputIOSignature, OutputIOSignature, BidirIOSignature, IOModelOptions, _chipflow_schema_uri from ._annotate import amaranth_annotate SIM_ANNOTATION_SCHEMA = str(_chipflow_schema_uri("simulatable-interface", 0)) -SIM_DATA_SCHEMA = str(_chipflow_schema_uri("simulatable-data", 0)) +DATA_SCHEMA = str(_chipflow_schema_uri("simulatable-data", 0)) +DRIVER_MODEL_SCHEMA = str(_chipflow_schema_uri("driver-model", 0)) class SimInterface(TypedDict): uid: str parameters: List[Tuple[str, Any]] -class SimData(TypedDict): - file_name: str +@runtime_checkable +@dataclass +class DataclassProtocol(Protocol): + pass + + +@dataclass +class SoftwareBuild: + """ + This holds the information needed for building software and providing the built outcome + """ + + sources: list[Path] + includes: list[Path] + include_dirs: list[Path] offset: int + filename: Path + build_dir: Path + type: Literal["SoftwareBuild"] = "SoftwareBuild" + + def __init__(self, *, sources: list[Path], includes: list[Path] = [], include_dirs = [], offset=0): + self.build_dir = _ensure_chipflow_root() / 'build' / 'software' + self.filename = self.build_dir / 'software.bin' + self.sources= list(sources) + self.includes = list(includes) + self.include_dirs = list(include_dirs) + self.offset = offset + + +_T_DataClass = TypeVar('_T_DataClass', bound=DataclassProtocol) +class Data(TypedDict, Generic[_T_DataClass]): + data: _T_DataClass + + +class DriverModel(TypedDict): + """ + Options for `SoftwareDriverSignature` + + Attributes: + component: The `wiring.Component` that this is the signature for. + regs_struct: The name of the C struct that represents the registers of this component + h_files: Header files for the driver + c_files: C files for the driver + regs_bus: The bus of this `Component` which contains its control registers + include_dirs: any extra include directories needed by the driver + """ + # we just extrat the info we need, don't actually serialise a `wiring.Component`... + component: Annotated[ + wiring.Component, + PlainSerializer(lambda x: { + 'name': x.__class__.__name__, + 'file': sys.modules[x.__module__].__file__ + }, return_type=dict), + WithJsonSchema({ + 'type': 'object', + 'properties': { + 'name': { 'type': 'string' }, + 'file': { 'type': 'string' }, + } + }), + WrapValidator(lambda v, h: v) # Don't care about it actually.. + ] | dict + + regs_struct: str + h_files: NotRequired[list[Path]] + c_files: NotRequired[list[Path]] + include_dirs: NotRequired[list[Path]] + regs_bus: NotRequired[str] + _base_path: NotRequired[Path] # gets filled by the decorator to the base directory where the Component was defined + _VALID_UID = re.compile('[a-zA-Z_.]').search @@ -124,7 +202,31 @@ def __chipflow_parameters__(self): return [('pin_count',self._pin_count)] -def attach_simulation_data(c: wiring.Component, **kwargs: Unpack[SimData]): - setattr(c.signature, '__chipflow_simulation_data__', kwargs) - amaranth_annotate(SimData, SIM_DATA_SCHEMA, '__chipflow_simulation_data__', decorate_object=True)(c.signature) +def attach_data(external_interface: wiring.PureInterface, component: wiring.Component, data: DataclassProtocol): + data_dict: Data = {'data':data} + setattr(component.signature, '__chipflow_data__', data_dict) + amaranth_annotate(Data, DATA_SCHEMA, '__chipflow_data__', decorate_object=True)(component.signature) + setattr(external_interface.signature, '__chipflow_data__', data_dict) + amaranth_annotate(Data, DATA_SCHEMA, '__chipflow_data__', decorate_object=True)(external_interface.signature) + + +class SoftwareDriverSignature(wiring.Signature): + + def __init__(self, members, **kwargs: Unpack[DriverModel]): + definition_file = sys.modules[kwargs['component'].__module__].__file__ + assert definition_file + base_path = Path(definition_file).parent.absolute() + kwargs['_base_path'] = base_path + if 'regs_bus' not in kwargs: + kwargs['regs_bus'] = 'bus' + + # execute any generators here + for k in ('c_files', 'h_files', 'includedirs'): + if k in kwargs: + kwargs[k] = list(kwargs[k]) #type: ignore + + self.__chipflow_driver_model__ = kwargs + amaranth_annotate(DriverModel, DRIVER_MODEL_SCHEMA, '__chipflow_driver_model__', decorate_object=True)(self) + super().__init__(members=members) + diff --git a/chipflow_lib/platforms/_software.py b/chipflow_lib/platforms/_software.py new file mode 100644 index 00000000..c312c9ab --- /dev/null +++ b/chipflow_lib/platforms/_software.py @@ -0,0 +1,116 @@ +# SPDX-License-Identifier: BSD-2-Clause + +import logging +import warnings + +from collections import defaultdict + +from amaranth import Fragment +from amaranth.hdl import UnusedElaboratable +from amaranth_soc import wishbone +from amaranth_soc.wishbone.sram import WishboneSRAM +from pydantic import TypeAdapter + +from .. import ChipFlowError +from ._signatures import DRIVER_MODEL_SCHEMA, DriverModel, DATA_SCHEMA, SoftwareBuild +from ._annotate import submodule_metadata +from ..software.soft_gen import SoftwareGenerator + + +logger = logging.getLogger(__name__) +__all__ = [] + + +def get_windows(wb_decoder): + def _translate(subwindow, window, window_name, window_range): + # Accessing a resource through a dense and then a sparse window results in very strange + # layouts that cannot be easily represented, so reject those. + window_start, window_stop, window_ratio = window_range + subwindow_mmap, subwindow_name, subwindow_range = subwindow + + assert window_ratio == 1 or subwindow.width == window.data_width + + # names, path is a list of MemoryMap.Name + if not subwindow_name: + path = None #ignore it + else: + path = subwindow_name if window_name is None else (*window_name, subwindow_name) + swstart, swend, swstep = subwindow_range + + start = (swstart// window_ratio) + window_start + end = swend // window_ratio + return (subwindow_mmap, path, (start, end, swstep)) + + windows = list(wb_decoder.bus.memory_map.windows()) + map = defaultdict(list) + for window, name, win_range in windows: + if name and len(name): + first_name = name[0] + map[first_name].append(win_range) + windows.extend([_translate(w, window, name, win_range) for w in window.windows()]) + return map + + +class SoftwarePlatform: + def __init__(self, config): + self._config = config + + def build(self, m, top): + warnings.simplefilter(action="ignore", category=UnusedElaboratable) + + frag = Fragment.get(m, None) + wb_decoder = None + sram = None + generators = {} + driver_models = {} + roms = {} + for key in top.keys(): + for component, name, meta in submodule_metadata(frag, key): + # logger.debug(f"{key} -> {component}, {name}, {meta.keys()}") + annotations = meta['annotations'] + if DRIVER_MODEL_SCHEMA in annotations: + driver_models[name] = TypeAdapter(DriverModel).validate_python(annotations[DRIVER_MODEL_SCHEMA]) + + if DATA_SCHEMA in annotations \ + and annotations[DATA_SCHEMA]['data']['type'] == "SoftwareBuild": + roms[name] = TypeAdapter(SoftwareBuild).validate_python(annotations[DATA_SCHEMA]['data']) + + if isinstance(component, wishbone.Decoder): + if wb_decoder is not None: + raise ChipFlowError("Multiple wishbone decoders are not currently supported, sorry! Get in touch!") + wb_decoder = component + if isinstance(component, WishboneSRAM): + if sram is not None: + raise ChipFlowError("Multiple top-level SRAMs are not currently supported, sorry! Get in touch!") + sram = name + + windows = get_windows(wb_decoder) + + ram = windows[sram][0] + ram_start = ram[0] + ram_size = ram[1]-ram[0] + + for rom_component, build in roms.items(): + # TODO: This is a nasty hack. basically it works becuase we assume that CSR addresses are later than ROM.. + # Need to figure out how to tell which bus is which in `get_windows` (using regs_bus) + + rom_range = windows[rom_component][0] + rom_start = rom_range[0] + rom_size = rom_range[1]-rom_range[0] + logger.debug(f"{key}.{rom_component} ROM start: {rom_start:08x}, size: {rom_size:08x}") + logger.debug(f"{key}.{sram} RAM start: {ram_start:08x} size: {ram_size:08x}") + sw = SoftwareGenerator(compiler_config=self._config.chipflow.software.riscv, + build=build, rom_start=rom_start, rom_size=rom_size, ram_start=ram_start, ram_size=ram_size) + + for component, driver_model in driver_models.items(): + # more of that nasty hack... + if component == rom_component: + addr = windows[component][1][0] + else: + addr = windows[component][0][0] + sw.add_periph(component, addr, driver_model) + + generators[key] = sw + + return generators + diff --git a/chipflow_lib/platforms/_utils.py b/chipflow_lib/platforms/_utils.py index a1fd54d9..4346de5c 100644 --- a/chipflow_lib/platforms/_utils.py +++ b/chipflow_lib/platforms/_utils.py @@ -10,7 +10,7 @@ from typing import Set, List, Dict, Optional, Union, Literal, Tuple, TypeVar from dataclasses import dataclass, asdict -from enum import Enum, IntEnum, StrEnum, auto +from enum import IntEnum, StrEnum, auto from math import ceil, floor from typing import ( Any, Annotated, NamedTuple, Generic, Self, @@ -20,22 +20,20 @@ TypedDict, Unpack, NotRequired ) - +from amaranth import Module from amaranth.lib import wiring, io from amaranth.lib.wiring import In, Out from pydantic import ( - ConfigDict, PlainSerializer, - WrapValidator + ConfigDict, PlainSerializer ) from .. import ChipFlowError, _ensure_chipflow_root, _get_cls_by_reference -from .._appresponse import AppResponseModel, OmitIfNone from ._annotate import amaranth_annotate from ._sky130 import Sky130DriveMode +from ..config_models import Config, Process, Voltage, VoltageRange if TYPE_CHECKING: - from ..config_models import Config from ._openframe import OpenframePackageDef @@ -45,21 +43,6 @@ def _chipflow_schema_uri(name: str, version: int) -> str: return f"https://api.chipflow.com/schemas/{version}/{name}" -Voltage = Annotated[ - float, - PlainSerializer(lambda x: f'{x:.1e}V', return_type=str), - WrapValidator(lambda v, h: h(v.strip('Vv ') if isinstance(v, str) else h(v))) - ] - - -class VoltageRange(AppResponseModel): - """ - Models a voltage range for a power domain or IO - """ - min: Annotated[Optional[Voltage], OmitIfNone()] = None - max: Annotated[Optional[Voltage], OmitIfNone()] = None - typical: Annotated[Optional[Voltage], OmitIfNone()] = None - class IOTripPoint(StrEnum): """ @@ -593,7 +576,6 @@ def register_component(self, name: str, component: wiring.Component) -> None: component: Amaranth `wiring.Component` to allocate """ - print(f"registering {component}") self._components[name] = component self._interfaces[name] = component.metadata.as_json() @@ -1094,25 +1076,6 @@ def heartbeat(self) -> Dict[int, GAPin]: return {0: GAPin('A', 2)} -class Process(Enum): - """ - IC manufacturing process - """ - #: Skywater foundry open-source 130nm process - SKY130 = "sky130" - #: GlobalFoundries open-source 130nm process - GF180 = "gf180" - #: Pragmatic Semiconductor FlexIC process (old) - HELVELLYN2 = "helvellyn2" - #: GlobalFoundries 130nm BCD process - GF130BCD = "gf130bcd" - #: IHP open source 130nm SiGe Bi-CMOS process - IHP_SG13G2 = "ihp_sg13g2" - - def __str__(self): - return f'{self.value}' - - def load_pinlock(): chipflow_root = _ensure_chipflow_root() lockfile = pathlib.Path(chipflow_root, 'pins.lock') @@ -1126,7 +1089,10 @@ def load_pinlock(): raise ChipFlowError("Lockfile `pins.lock` not found. Run `chipflow pin lock`") -def top_components(config): +def top_components(config: 'Config') -> Dict[str, wiring.Component]: + """ + Return the top level components for the design, as configured in ``chipflow.toml`` + """ component_configs = {} result = {} @@ -1138,7 +1104,7 @@ def top_components(config): logger.debug(f"Config {param} = {conf} found for {name}") component_configs[param] = conf if name.startswith('_'): - raise ChipFlowError(f"Top components cannot start with '_': {name}") + raise ChipFlowError(f"Top components cannot start with '_' character, these are reserved for internal use: {name}") # Second pass: instantiate components for name, ref in config.chipflow.top.items(): @@ -1148,6 +1114,18 @@ def top_components(config): result[name] = cls(component_configs[name]) else: result[name] = cls() - logger.debug(f"top members for {name}:\n{pformat(result[name].metadata.origin.signature.members)}") + logger.debug(f"Top members for {name}:\n{pformat(result[name].metadata.origin.signature.members)}") return result + + +def get_software_builds(m: Module, component: str): + from ._signatures import DATA_SCHEMA, SoftwareBuild + builds = {} + iface = getattr(m.submodules, component).metadata.as_json() + for interface, interface_desc in iface['interface']['members'].items(): + annotations = interface_desc['annotations'] + if DATA_SCHEMA in annotations \ + and annotations[DATA_SCHEMA]['data']['type'] == "SoftwareBuild": + builds[interface] = pydantic.TypeAdapter(SoftwareBuild).validate_python(annotations[DATA_SCHEMA]['data']) + return builds diff --git a/chipflow_lib/platforms/silicon.py b/chipflow_lib/platforms/silicon.py index d154f580..d70bcc05 100644 --- a/chipflow_lib/platforms/silicon.py +++ b/chipflow_lib/platforms/silicon.py @@ -1,24 +1,25 @@ -# amaranth: UnusedElaboratable=no - # SPDX-License-Identifier: BSD-2-Clause import copy import logging import os import re import subprocess +import warnings from pprint import pformat from typing import TYPE_CHECKING, List, Generic from amaranth import Module, Signal, ClockDomain, ClockSignal, ResetSignal, unsigned from amaranth.lib import io, data +from amaranth.hdl import UnusedElaboratable from amaranth.lib.cdc import FFSynchronizer from amaranth.back import rtlil #type: ignore[reportAttributeAccessIssue] from amaranth.hdl import Fragment from amaranth.hdl._ir import PortDirection from .. import ChipFlowError -from ._utils import load_pinlock, PortDesc, Pin, IOModel, IOTripPoint, Process +from ..config_models import Process +from ._utils import load_pinlock, PortDesc, Pin, IOModel, IOTripPoint from ._sky130 import Sky130DriveMode if TYPE_CHECKING: @@ -487,8 +488,16 @@ def _prepare(self, elaboratable, name="top"): return fragment.prepare(ports) def build(self, elaboratable, name="top"): - fragment = self._prepare(elaboratable, name) - rtlil_text, _ = rtlil.convert_fragment(fragment, name) + # hide Amaranth `UnusedElaboratable` warnings + warnings.simplefilter(action="ignore", category=UnusedElaboratable) + try: + fragment = self._prepare(elaboratable, name) + rtlil_text, _ = rtlil.convert_fragment(fragment, name) + except Exception as e: + raise ChipFlowError("Error found when building design.") from e + + # Enable warnings when an exception hasn't occured + warnings.filterwarnings("default", category=UnusedElaboratable) # Integrate Amaranth design with external Verilog yosys_script = [ diff --git a/chipflow_lib/platforms/sim.py b/chipflow_lib/platforms/sim.py index 16892fb5..b91b01a4 100644 --- a/chipflow_lib/platforms/sim.py +++ b/chipflow_lib/platforms/sim.py @@ -1,8 +1,8 @@ # SPDX-License-Identifier: BSD-2-Clause import logging -import os import sys +import warnings from dataclasses import dataclass from enum import StrEnum @@ -12,15 +12,16 @@ from amaranth import Module, ClockSignal, ResetSignal, ClockDomain from amaranth.lib import io, wiring from amaranth.back import rtlil # type: ignore[reportAttributeAccessIssue] +from amaranth.hdl import UnusedElaboratable from amaranth.hdl._ir import PortDirection from amaranth.lib.cdc import FFSynchronizer from jinja2 import Environment, PackageLoader, select_autoescape -from pydantic import BaseModel +from pydantic import BaseModel, TypeAdapter from .. import ChipFlowError, _ensure_chipflow_root from ._signatures import ( I2CSignature, GPIOSignature, UARTSignature, SPISignature, QSPIFlashSignature, - SIM_ANNOTATION_SCHEMA, SIM_DATA_SCHEMA, SimInterface + SIM_ANNOTATION_SCHEMA, DATA_SCHEMA, SimInterface, SoftwareBuild ) from ._utils import load_pinlock, Interface @@ -132,7 +133,7 @@ def find_builder(builders: List[BasicCxxBuilder], sim_interface: SimInterface): for b in builders: if uid in b._table: return b - logger.warn(f"Unable to find builder for '{uid}'") + logger.warn(f"Unable to find a simulation model for '{uid}'") return None @@ -152,7 +153,7 @@ def find_builder(builders: List[BasicCxxBuilder], sim_interface: SimInterface): class SimPlatform: def __init__(self, config): - self.build_dir = os.path.join(os.environ['CHIPFLOW_ROOT'], 'build', 'sim') + self.build_dir = _ensure_chipflow_root() / 'build' / 'sim' self.extra_files = dict() self.sim_boxes = dict() self._ports: Dict[str, io.SimulationPort] = {} @@ -161,7 +162,6 @@ def __init__(self, config): self._resets = {} self._builders: List[BasicCxxBuilder] = [ _COMMON_BUILDER ] self._top_sim = {} - self._sim_data = {} def add_file(self, filename, content): if not isinstance(content, (str, bytes)): @@ -169,6 +169,8 @@ def add_file(self, filename, content): self.extra_files[filename] = content def build(self, e, top): + warnings.simplefilter(action="ignore", category=UnusedElaboratable) + Path(self.build_dir).mkdir(parents=True, exist_ok=True) ports = [] @@ -208,17 +210,20 @@ def build(self, e, top): metadata = {} for key in top.keys(): metadata[key] = getattr(e.submodules, key).metadata.as_json() + + + sim_data = {} for component, iface in metadata.items(): for interface, interface_desc in iface['interface']['members'].items(): annotations = interface_desc['annotations'] - - if SIM_DATA_SCHEMA in annotations: - self._sim_data[interface] = annotations[SIM_DATA_SCHEMA] + if DATA_SCHEMA in annotations \ + and annotations[DATA_SCHEMA]['data']['type'] == "SoftwareBuild": + sim_data[interface] = TypeAdapter(SoftwareBuild).validate_python(annotations[DATA_SCHEMA]['data']) data_load = [] - for i,d in self._sim_data.items(): - args = [f"0x{d['offset']:X}U"] - p = Path(d['file_name']) + for i,d in sim_data.items(): + args = [f"0x{d.offset:X}U"] + p = d.filename if not p.is_absolute(): p = _ensure_chipflow_root() / p data_load.append({'model_name': i, 'file_name': p, 'args': args}) diff --git a/chipflow_lib/platforms/software_build.py b/chipflow_lib/platforms/software_build.py new file mode 100644 index 00000000..1121b11c --- /dev/null +++ b/chipflow_lib/platforms/software_build.py @@ -0,0 +1,41 @@ +import sys + + +from doit import task_params + +from .._doit import TaskParams +from ..software.soft_gen import SoftwareGenerator + +@task_params([ + TaskParams(name="generator", default=None, type=SoftwareGenerator.model_validate_json), #type: ignore + ]) +def task_build_software_elf(generator): + generator.generate() + sources = [str(f) for f in generator.sources] + includes = [str(f) for f in generator.includes] + inc_dirs = ' '.join([f"-I{f}" for f in generator.include_dirs]) + sources_str = " ".join(sources) + link_scr = str(generator.link_script) + return { + "actions": [f"{generator.compiler} {generator.cflags} {inc_dirs} -o {generator.build.build_dir}/software.elf {sources_str}"], + "file_dep": sources + includes + [link_scr], + "targets": [f"{generator.build.build_dir}/software.elf"], + "verbosity": 2 + } + + +@task_params([ + TaskParams(name="generator", default=None, type=SoftwareGenerator.model_validate_json), #type: ignore + ]) +def task_build_software(generator): + build_dir = generator.build.build_dir + return { + "actions": [f"{sys.executable} -m ziglang objcopy -O binary " + f"{build_dir}/software.elf {build_dir}/software.bin"], + "task_dep": ['build_software_elf'], + "file_dep": [f"{build_dir}/software.elf"], + "targets": [f"{build_dir}/software.bin"], + } + + + diff --git a/chipflow_lib/software/_builder.py b/chipflow_lib/software/_builder.py new file mode 100644 index 00000000..18bb9e3a --- /dev/null +++ b/chipflow_lib/software/_builder.py @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: BSD-2-Clause + + + diff --git a/chipflow_lib/software/drivers/gpio.h b/chipflow_lib/software/drivers/gpio.h deleted file mode 100644 index 5ba953eb..00000000 --- a/chipflow_lib/software/drivers/gpio.h +++ /dev/null @@ -1,48 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -#ifndef GPIO_H -#define GPIO_H - -#include - -typedef struct __attribute__((packed, aligned(2))) { - uint16_t mode; - uint8_t input; - uint8_t output; - uint16_t setclr; -} gpio_regs_t; - -typedef enum { -#define _GPIO_PIN(n) \ - GPIO_PIN ## n ## _INPUT_ONLY = (0 << 2 * (n)), \ - GPIO_PIN ## n ## _PUSH_PULL = (1 << 2 * (n)), \ - GPIO_PIN ## n ## _OPEN_DRAIN = (2 << 2 * (n)), \ - GPIO_PIN ## n ## _ALTERNATE = (3 << 2 * (n)) - - _GPIO_PIN(0), - _GPIO_PIN(1), - _GPIO_PIN(2), - _GPIO_PIN(3), - _GPIO_PIN(4), - _GPIO_PIN(5), - _GPIO_PIN(6), - _GPIO_PIN(7), -#undef _GPIO_PIN -} gpio_mode_t; - -typedef enum { -#define _GPIO_PIN(n) \ - GPIO_PIN ## n ## _SET = (1 << 2 * (n)), \ - GPIO_PIN ## n ## _CLEAR = (2 << 2 * (n)) - - _GPIO_PIN(0), - _GPIO_PIN(1), - _GPIO_PIN(2), - _GPIO_PIN(3), - _GPIO_PIN(4), - _GPIO_PIN(5), - _GPIO_PIN(6), - _GPIO_PIN(7), -#undef _GPIO_PIN -} gpio_setclr_t; - -#endif diff --git a/chipflow_lib/software/drivers/i2c.c b/chipflow_lib/software/drivers/i2c.c deleted file mode 100644 index 2e1bd2ee..00000000 --- a/chipflow_lib/software/drivers/i2c.c +++ /dev/null @@ -1,32 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -#include "i2c.h" - -void i2c_init(volatile i2c_regs_t *i2c, uint32_t divider) { - i2c->divider = divider; -} - -void i2c_start(volatile i2c_regs_t *i2c) { - i2c->action = (1<<1); - while (i2c->status & 0x1) - ; -} - -int i2c_write(volatile i2c_regs_t *i2c, uint8_t data) { - i2c->send_data = data; - while (i2c->status & 0x1) - ; - return (i2c->status & 0x2) != 0; // check ACK -} - -uint8_t i2c_read(volatile i2c_regs_t *i2c) { - i2c->action = (1<<3); - while (i2c->status & 0x1) - ; - return i2c->receive_data; -} - -void i2c_stop(volatile i2c_regs_t *i2c) { - i2c->action = (1<<2); - while (i2c->status & 0x1) - ; -} diff --git a/chipflow_lib/software/drivers/i2c.h b/chipflow_lib/software/drivers/i2c.h deleted file mode 100644 index 3f708650..00000000 --- a/chipflow_lib/software/drivers/i2c.h +++ /dev/null @@ -1,21 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -#ifndef I2C_H -#define I2C_H - -#include - -typedef struct { - uint32_t divider; - uint32_t action; - uint32_t send_data; - uint32_t receive_data; - uint32_t status; -} i2c_regs_t; - -void i2c_init(volatile i2c_regs_t *i2c, uint32_t divider); -void i2c_start(volatile i2c_regs_t *i2c); -int i2c_write(volatile i2c_regs_t *i2c, uint8_t data); -uint8_t i2c_read(volatile i2c_regs_t *i2c); -void i2c_stop(volatile i2c_regs_t *i2c); - -#endif diff --git a/chipflow_lib/software/drivers/plat_timer.c b/chipflow_lib/software/drivers/plat_timer.c deleted file mode 100644 index 899e98c6..00000000 --- a/chipflow_lib/software/drivers/plat_timer.c +++ /dev/null @@ -1,14 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -#include "plat_timer.h" - -uint64_t plat_timer_read(volatile plat_timer_regs_t *timer) { - uint32_t cnt_lo = timer->cnt_lo; - __asm__ volatile ("" : : : "memory"); - return (((uint64_t)timer->cnt_hi) << 32ULL) | cnt_lo; -} - -void plat_timer_schedule(volatile plat_timer_regs_t *timer, uint64_t val) { - timer->cmp_lo = val & 0xFFFFFFFFU; - __asm__ volatile ("" : : : "memory"); - timer->cmp_hi = (val >> 32U) & 0xFFFFFFFFU; -} diff --git a/chipflow_lib/software/drivers/plat_timer.h b/chipflow_lib/software/drivers/plat_timer.h deleted file mode 100644 index 0c4eb332..00000000 --- a/chipflow_lib/software/drivers/plat_timer.h +++ /dev/null @@ -1,17 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -#ifndef PLAT_TIMER_H -#define PLAT_TIMER_H - -#include - -typedef struct __attribute__((packed, aligned(4))) { - uint32_t cnt_lo; - uint32_t cnt_hi; - uint32_t cmp_lo; - uint32_t cmp_hi; -} plat_timer_regs_t; - -uint64_t plat_timer_read(volatile plat_timer_regs_t *timer); -void plat_timer_schedule(volatile plat_timer_regs_t *timer, uint64_t val); - -#endif diff --git a/chipflow_lib/software/drivers/soc_id.h b/chipflow_lib/software/drivers/soc_id.h deleted file mode 100644 index c0936b61..00000000 --- a/chipflow_lib/software/drivers/soc_id.h +++ /dev/null @@ -1,12 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -#ifndef SOC_ID_H -#define SOC_ID_H - -#include - -typedef struct __attribute__((packed, aligned(4))) { - uint32_t type; - uint32_t version; -} soc_id_regs_t; - -#endif diff --git a/chipflow_lib/software/drivers/spi.c b/chipflow_lib/software/drivers/spi.c deleted file mode 100644 index 951bcc0f..00000000 --- a/chipflow_lib/software/drivers/spi.c +++ /dev/null @@ -1,18 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -#include "spi.h" - -void spi_init(volatile spi_regs_t *spi, uint32_t divider) { - spi->divider = divider; - spi->config = 0x02; // CS=0, SCK_EDGE=1, SCK_IDLE=0 -} - -uint32_t spi_xfer(volatile spi_regs_t *spi, uint32_t data, uint32_t width, bool deselect) { - spi->config = ((width - 1) << 3) | 0x06; // CS=1, SCK_EDGE=1, SCK_IDLE=0 - spi->send_data = data << (32U - width); - while (!(spi->status & 0x1)) // wait for rx full - ; - if (deselect) { - spi->config = ((width - 1) << 3) | 0x02; // CS=0, SCK_EDGE=1, SCK_IDLE=0 - } - return spi->receive_data; -} diff --git a/chipflow_lib/software/drivers/spi.h b/chipflow_lib/software/drivers/spi.h deleted file mode 100644 index a4f4836e..00000000 --- a/chipflow_lib/software/drivers/spi.h +++ /dev/null @@ -1,19 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -#ifndef SPI_H -#define SPI_H - -#include -#include - -typedef struct { - uint32_t config; - uint32_t divider; - uint32_t send_data; - uint32_t receive_data; - uint32_t status; -} spi_regs_t; - -void spi_init(volatile spi_regs_t *spi, uint32_t divider); -uint32_t spi_xfer(volatile spi_regs_t *spi, uint32_t data, uint32_t width, bool deselect); - -#endif diff --git a/chipflow_lib/software/drivers/spiflash.S b/chipflow_lib/software/drivers/spiflash.S deleted file mode 100644 index 4026be67..00000000 --- a/chipflow_lib/software/drivers/spiflash.S +++ /dev/null @@ -1,58 +0,0 @@ -.global flashio_worker_begin -.global flashio_worker_end - -.balign 4 - -flashio_worker_begin: -# a0 ... flash base address -# a1 ... data pointer -# a2 ... data length -# a3 ... optional WREN cmd (0 = disable) - -mv t3, ra - -# address of SPI ctrl reg -li a0, 0xb0000000 -# enter bypass mode -lbu t1, 0(a0) -ori t1, t1, 0x1 -sb t1, 0(a0) -call flashio_wait_bypass_ready - -beqz a3, flashio_xfer - -sb a3, 8(a0) # send wren -call flashio_wait_bypass_ready -li t1, 2 # deselect -sb t1, 4(a0) -call flashio_wait_bypass_ready - -flashio_xfer: -beqz a2, flashio_done -lbu t1, 0(a1) -sb t1, 8(a0) # tx data -call flashio_wait_bypass_ready -lbu t1, 12(a0) # rx data -sb t1, 0(a1) -addi a1, a1, 1 -addi a2, a2, -1 -j flashio_xfer - -flashio_done: -# exit bypass mode -lbu t1, 0(a0) -andi t1, t1, 0xFE -sb t1, 0(a0) - -fence.i -mv ra, t3 -ret - -flashio_wait_bypass_ready: -lbu t1, 4(a0) -andi t1, t1, 0x1 -beqz t1, flashio_wait_bypass_ready -ret - -.balign 4 -flashio_worker_end: diff --git a/chipflow_lib/software/drivers/spiflash.c b/chipflow_lib/software/drivers/spiflash.c deleted file mode 100644 index fbf7b101..00000000 --- a/chipflow_lib/software/drivers/spiflash.c +++ /dev/null @@ -1,74 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -#include -#include "spiflash.h" - -extern uint32_t flashio_worker_begin; -extern uint32_t flashio_worker_end; - -void spiflash_io(volatile spiflash_regs_t *flash, uint8_t *data, int len, uint8_t wrencmd) { - // Flash can't be accessed during IO, so copy to RAM and run that - volatile uint32_t func[&flashio_worker_end - &flashio_worker_begin]; - - // Can't execute off flash while talking to it, so copy IO code to SRAM - uint32_t *src_ptr = &flashio_worker_begin; - volatile uint32_t *dst_ptr = func; - - while (src_ptr != &flashio_worker_end) - *(dst_ptr++) = *(src_ptr++); - - __asm__ volatile ("fence.i" : : : "memory"); - - ((void(*)(uint8_t*, uint8_t*, uint32_t, uint32_t))func)((uint8_t*)flash, data, len, wrencmd); -} - -uint32_t spiflash_read_id(volatile spiflash_regs_t *flash) { - uint8_t buffer[5] = { 0x9F, /* zeros */ }; - spiflash_io(flash, buffer, 5, 0); - - uint32_t id = 0; - for (int i = 1; i <= 4; i++) { - id = id << 8U; - id |= buffer[i]; - } - return id; -} - -bool spiflash_is_winbond(volatile spiflash_regs_t *flash) { - uint32_t id; - id = spiflash_read_id(flash); - if ((id & 0x00ff0000) == WINBOND_ID<<16) return true; - else return false; -} - -void spiflash_set_qspi_flag(volatile spiflash_regs_t *flash) { - uint8_t buffer[8]; - - //Check which device we have - if (spiflash_is_winbond(flash)) { - // Read Configuration Registers (RDCR1 35h) - buffer[0] = 0x35; - buffer[1] = 0x00; // rdata - spiflash_io(flash, buffer, 2, 0); - uint8_t sr2 = buffer[1]; - - // Write Enable Volatile (50h) + Write Status Register 2 (31h) - buffer[0] = 0x31; - buffer[1] = sr2 | 2; // Enable QSPI - spiflash_io(flash, buffer, 2, 0x50); - } else { - // Read Configuration Registers (RDCR1 05h) - buffer[0] = 0x05; - buffer[1] = 0x00; // rdata - spiflash_io(flash, buffer, 2, 0); - uint8_t sr2 = buffer[1]; - - // Write Enable Volatile (06h) + Write Status Register 2 (01h) - buffer[0] = 0x01; - buffer[1] = sr2 | 1<<6; // Enable QSPI - spiflash_io(flash, buffer, 2, 0x06); - } -} - -void spiflash_set_quad_mode(volatile spiflash_regs_t *flash) { - flash->config = (0x3U << 3U) | (0x03U << 1U); // 3 dummy byte, X4 mode -} diff --git a/chipflow_lib/software/drivers/spiflash.h b/chipflow_lib/software/drivers/spiflash.h deleted file mode 100644 index a5587bae..00000000 --- a/chipflow_lib/software/drivers/spiflash.h +++ /dev/null @@ -1,22 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -#ifndef SPI_FLASH_H -#define SPI_FLASH_H - -#include - -#define WINBOND_ID 0x40 -#define ISSI_ID 0x60 - -typedef struct __attribute__((packed, aligned(4))) { - uint32_t config; - uint32_t raw_control; - uint32_t raw_tx_data; - uint32_t raw_rx_data; -} spiflash_regs_t; - -void spiflash_io(volatile spiflash_regs_t *flash, uint8_t *data, int len, uint8_t wrencmd); -uint32_t spiflash_read_id(volatile spiflash_regs_t *flash); -void spiflash_set_qspi_flag(volatile spiflash_regs_t *flash); -void spiflash_set_quad_mode(volatile spiflash_regs_t *flash); - -#endif diff --git a/chipflow_lib/software/drivers/uart.c b/chipflow_lib/software/drivers/uart.c deleted file mode 100644 index ec1422e3..00000000 --- a/chipflow_lib/software/drivers/uart.c +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -#include "uart.h" - -void uart_init(volatile uart_regs_t *uart, uint32_t divisor) { - uart->tx.config = 0; - uart->tx.phy_config = divisor & 0x00FFFFFF; - uart->tx.config = 1; - uart->rx.config = 0; - uart->rx.phy_config = divisor & 0x00FFFFFF; - uart->rx.config = 1; -}; - -void uart_putc(volatile uart_regs_t *uart, char c) { - if (c == '\n') - uart_putc(uart, '\r'); - while (!(uart->tx.status & 0x1)) - ; - uart->tx.data = c; -} - -void uart_puts(volatile uart_regs_t *uart, const char *s) { - while (*s != 0) - uart_putc(uart, *s++); -} - - -void uart_puthex(volatile uart_regs_t *uart, uint32_t x) { - for (int i = 7; i >= 0; i--) { - uint8_t nib = (x >> (4 * i)) & 0xF; - if (nib <= 9) - uart_putc(uart, '0' + nib); - else - uart_putc(uart, 'A' + (nib - 10)); - } -} diff --git a/chipflow_lib/software/drivers/uart.h b/chipflow_lib/software/drivers/uart.h deleted file mode 100644 index 90ab00e2..00000000 --- a/chipflow_lib/software/drivers/uart.h +++ /dev/null @@ -1,26 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -#ifndef UART_H -#define UART_H - -#include - -typedef struct __attribute__((packed, aligned(4))) { - uint8_t config; - uint8_t padding_0[3]; - uint32_t phy_config; - uint8_t status; - uint8_t data; - uint8_t padding_1[6]; -} uart_mod_regs_t; - -typedef struct __attribute__((packed, aligned(4))) { - uart_mod_regs_t rx; - uart_mod_regs_t tx; -} uart_regs_t; - -void uart_init(volatile uart_regs_t *uart, uint32_t divisor); -void uart_putc(volatile uart_regs_t *uart, char c); -void uart_puts(volatile uart_regs_t *uart, const char *s); -void uart_puthex(volatile uart_regs_t *uart, uint32_t x); - -#endif diff --git a/chipflow_lib/software/soft_gen.py b/chipflow_lib/software/soft_gen.py index 891e148a..7e88fd4e 100644 --- a/chipflow_lib/software/soft_gen.py +++ b/chipflow_lib/software/soft_gen.py @@ -1,50 +1,118 @@ # SPDX-License-Identifier: BSD-2-Clause + +import sys + +from collections import defaultdict +from pydantic import BaseModel from pathlib import Path +from typing import NamedTuple, Optional + +from ..platforms._signatures import DriverModel, SoftwareBuild +from ..config_models import CompilerConfig + +class Periph(NamedTuple): + name: str + component: str + regs_struct: str + address: int + + +class SoftwareGenerator(BaseModel): + build: SoftwareBuild + rom_start: int + rom_size: int + ram_start: int + ram_size: int + compiler_config: 'CompilerConfig' + _periphs: set[Periph] = set() + _drivers: dict = defaultdict(set) + _startup_asm: Optional[Path] = None + _link_script: Optional[Path] = None + + def generate(self): + out_dir = self.build.build_dir / "generated" + out_dir.mkdir(parents=True, exist_ok=True) + + start = Path(out_dir) / "start.S" + start.write_text(self.start) + self._startup_asm = start + + lds = Path(out_dir) / "sections.lds" + lds.write_text(self.lds) + self._link_script = lds + + soc_h = Path(out_dir) / "soc.h" + soc_h.write_text(self.soc_h) + self._drivers['h_files'].add(soc_h) + + self._drivers['include_dirs'].add(out_dir) + + def add_periph(self, name, address, model: DriverModel): + + assert '_base_path' in model + + for k in ('c_files', 'h_files', 'include_dirs'): + if k in model: + for p in model[k]: # type: ignore + if not p.is_absolute(): + self._drivers[k].add(model['_base_path'] / p) + else: + self._drivers[k].add(p) + component = model['component']['name'] #type: ignore + regs_struct = model['regs_struct'] + self._periphs.add(Periph(name, component, regs_struct, address)) -class SoftwareGenerator: - def __init__(self, *, rom_start, rom_size, ram_start, ram_size): - self.rom_start = rom_start - self.rom_size = rom_size - self.ram_start = ram_start - self.ram_size = ram_size - self.defines = [] - self.periphs = [] - self.extra_init = [] - print("initialised SoftwareGenerator") - - def generate(self, out_dir): - Path(out_dir).mkdir(parents=True, exist_ok=True) - print(f"generating in {out_dir}") - with open(Path(out_dir) / "start.S", "w") as f: - f.write(self.start) - with open(Path(out_dir) / "sections.lds", "w") as f: - f.write(self.lds) - with open(Path(out_dir) / "soc.h", "w") as f: - f.write(self.soc_h) - - def add_periph(self, periph_type, name, address): - self.periphs.append((periph_type, name, address)) - - def add_extra_init(self, asm): - self.extra_init.append(asm) + @property + def compiler(self): + return f"{sys.executable} -m ziglang cc -target riscv32-freestanding-musl" + + @property + def cflags(self): + cflags = "-g -mcpu=baseline_rv32-a-c-d -mabi=ilp32 " + cflags += "-static -ffreestanding -nostdlib " + cflags += f"-Wl,-Bstatic,-T,{self._link_script},--strip-debug " + cflags += f"-I{self.build.build_dir}" + return cflags + + @property + def sources(self): + sources = set(self._drivers['c_files']).union(self.build.sources) + return [self._startup_asm] + sorted(sources) + + @property + def includes(self): + includes = set(self._drivers['h_files']).union(self.build.includes) + return sorted(includes) + + @property + def include_dirs(self): + inc_dirs = set(self._drivers['include_dirs']).union(self.build.include_dirs) + return sorted(inc_dirs) + + @property + def link_script(self): + return self._link_script + + @property + def periphs(self): + return sorted(self._periphs) @property def soc_h(self): result = "#ifndef SOC_H\n" - result += "#define SOC_H\n" - periph_types = sorted(set(x[0] for x in self.periphs)) + result += "#define SOC_H\n\n" - for t in periph_types: - result += f'#include "drivers/{t}.h"\n' + for i in self.includes: + result += f'#include "{i}"\n' result += "\n" uart = None - for t, n, a in self.periphs: - if uart is None and t == "uart": # first UART - uart = n - result += f'#define {n} ((volatile {t}_regs_t *const)0x{a:08x})\n' + for n, t, r, a in self.periphs: + if uart is None and t == "UARTPeripheral": # first UART + uart = n.upper() + result += f'#define {n.upper()} ((volatile {r} *const)0x{a:08x})\n' result += '\n' @@ -62,7 +130,6 @@ def soc_h(self): @property def start(self): - joined_init = '\n'.join(self.extra_init) return f""".section .text start: @@ -103,8 +170,6 @@ def start(self): addi x30, zero, 0 addi x31, zero, 0 -{joined_init} - # copy data section la a0, _sidata la a1, _sdata @@ -136,9 +201,11 @@ def start(self): @property def lds(self): + rom_start = self.rom_start + self.build.offset + rom_size = self.rom_size - self.build.offset return f"""MEMORY {{ - FLASH (rx) : ORIGIN = 0x{self.rom_start:08x}, LENGTH = 0x{self.rom_size:08x} + FLASH (rx) : ORIGIN = 0x{rom_start:08x}, LENGTH = 0x{rom_size:08x} RAM (xrw) : ORIGIN = 0x{self.ram_start:08x}, LENGTH = 0x{self.ram_size:08x} }} diff --git a/chipflow_lib/steps/__init__.py b/chipflow_lib/steps/__init__.py index d5086fee..11e984d2 100644 --- a/chipflow_lib/steps/__init__.py +++ b/chipflow_lib/steps/__init__.py @@ -53,7 +53,6 @@ def _wire_up_ports(m: Module, top, platform): for n, t in top.items(): logger.debug(f" > {n}, {t}") setattr(m.submodules, n, t) - print("Wiring up ports:") for component, iface in platform._pinlock.port_map.ports.items(): if component.startswith('_'): logger.debug(f"Ignoring special component {component}") diff --git a/chipflow_lib/steps/silicon.py b/chipflow_lib/steps/silicon.py index 2357e586..eb0ae246 100644 --- a/chipflow_lib/steps/silicon.py +++ b/chipflow_lib/steps/silicon.py @@ -2,7 +2,6 @@ # SPDX-License-Identifier: BSD-2-Clause -import argparse import inspect import json import logging @@ -23,7 +22,8 @@ from . import StepBase, _wire_up_ports from .. import ChipFlowError from ..cli import log_level -from ..platforms._internal import SiliconPlatform, top_components, load_pinlock +from ..platforms._utils import top_components, load_pinlock +from ..platforms.silicon import SiliconPlatform logger = logging.getLogger(__name__) @@ -81,10 +81,12 @@ def build_cli_parser(self, parser): submit_subparser = action_argument.add_parser( "submit", help=inspect.getdoc(self.submit).splitlines()[0]) # type: ignore submit_subparser.add_argument( - "--dry-run", help=argparse.SUPPRESS, + "--dry-run", + help="Build but do not submit design to cloud. Will output `rtlil` and `config` files.", default=False, action="store_true") submit_subparser.add_argument( - "--wait", help=argparse.SUPPRESS, + "--wait", + help="Maintain connection to cloud and trace build messages. Filtering is based on the log level (see `verbose` option).", default=False, action="store_true") def run_cli(self, args): @@ -171,10 +173,11 @@ def submit(self, rtlil_path, args): logger.debug(f"data=\n{json.dumps(data, indent=2)}") logger.debug(f"files['config']=\n{config}") shutil.copyfile(rtlil_path, 'rtlil') - with open("data", 'w') as f: + with open("rtlil", 'w') as f: json.dump(data, f) with open("config", 'w') as f: f.write(config) + sp.info("Compiled design and configuration can be found in in `rtlil` and `config`") return def network_err(e): diff --git a/chipflow_lib/steps/sim.py b/chipflow_lib/steps/sim.py index b496d875..7d5207cc 100644 --- a/chipflow_lib/steps/sim.py +++ b/chipflow_lib/steps/sim.py @@ -13,8 +13,8 @@ from . import StepBase, _wire_up_ports from .. import ChipFlowError, _ensure_chipflow_root -from ..platforms._internal import SimPlatform, top_components -from ..platforms.sim import VARIABLES, TASKS, DOIT_CONFIG +from ..platforms._utils import top_components +from ..platforms.sim import VARIABLES, TASKS, DOIT_CONFIG, SimPlatform EXE = ".exe" if os.name == "nt" else "" diff --git a/chipflow_lib/steps/software.py b/chipflow_lib/steps/software.py index 984daefb..03a21966 100644 --- a/chipflow_lib/steps/software.py +++ b/chipflow_lib/steps/software.py @@ -1,10 +1,17 @@ # SPDX-License-Identifier: BSD-2-Clause +import logging + from doit.cmd_base import ModuleTaskLoader from doit.doit_cmd import DoitMain +from amaranth import Module from . import StepBase -from ..platforms import SimPlatform +from .. import ChipFlowError +from ..platforms._software import SoftwarePlatform +from ..platforms._utils import top_components + +logger = logging.getLogger(__name__) class SoftwareStep(StepBase): """Base step to build the software.""" @@ -12,8 +19,8 @@ class SoftwareStep(StepBase): doit_build_module = None def __init__(self, config): - self._platform = SimPlatform(config) - pass + self._platform = SoftwarePlatform(config) + self._config = config def build_cli_parser(self, parser): pass @@ -21,11 +28,23 @@ def build_cli_parser(self, parser): def run_cli(self, args): self.build() - def doit_build(self): - "Run the overridden doit_build_module" - DoitMain(ModuleTaskLoader(self.doit_build_module)).run(["build_software"]) - def build(self, *args): "Build the software for your design" print("Building software...") - self.doit_build() + + m = Module() + top = top_components(self._config) + logger.debug(f"SoftwareStep top = {top}") + logger.debug("-> Adding top components:") + + for n, t in top.items(): + setattr(m.submodules, n, t) + + generators = self._platform.build(m, top) + + from ..platforms import software_build + for name, gen in generators.items(): + loader = ModuleTaskLoader(software_build) + loader.task_opts = {"build_software": {"generator": gen}, "build_software_elf": {'generator': gen}} #type: ignore + if DoitMain(loader).run(["build_software"]) != 0: + raise ChipFlowError("Software Build failed") diff --git a/pdm.lock b/pdm.lock index fe547b2d..a3974b9a 100644 --- a/pdm.lock +++ b/pdm.lock @@ -54,10 +54,10 @@ files = [ [[package]] name = "amaranth-boards" -version = "0.1.dev258" +version = "0.1.dev259" requires_python = "~=3.9" git = "https://github.com/amaranth-lang/amaranth-boards" -revision = "c26a72e59c786b38e0e989ae64c6c2560ca7c29c" +revision = "7e24efe2f6e95afddd0c1b56f1a9423c48caa472" summary = "Board and connector definitions for Amaranth HDL" groups = ["default"] dependencies = [ @@ -92,16 +92,16 @@ files = [ [[package]] name = "amaranth-yosys" -version = "0.50.0.0.post113" +version = "0.50.0.0.post115" requires_python = "~=3.8" summary = "Specialized WebAssembly build of Yosys used by Amaranth HDL" groups = ["default"] dependencies = [ "importlib-resources>=1.4; python_version < \"3.9\"", - "wasmtime<35,>=1", + "wasmtime<37,>=1", ] files = [ - {file = "amaranth_yosys-0.50.0.0.post113-py3-none-any.whl", hash = "sha256:b294c3ad637da758aef0ad58962d3e8b249862461a1650890ac1f76b54d44caf"}, + {file = "amaranth_yosys-0.50.0.0.post115-py3-none-any.whl", hash = "sha256:a37253df4c1b782dc981430e38f796165b58de13e158e21160ae043105d38ba0"}, ] [[package]] @@ -191,7 +191,7 @@ files = [ [[package]] name = "beautifulsoup4" -version = "4.13.4" +version = "4.13.5" requires_python = ">=3.7.0" summary = "Screen-scraping library" groups = ["dev"] @@ -200,69 +200,74 @@ dependencies = [ "typing-extensions>=4.0.0", ] files = [ - {file = "beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b"}, - {file = "beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195"}, + {file = "beautifulsoup4-4.13.5-py3-none-any.whl", hash = "sha256:642085eaa22233aceadff9c69651bc51e8bf3f874fb6d7104ece2beb24b47c4a"}, + {file = "beautifulsoup4-4.13.5.tar.gz", hash = "sha256:5e70131382930e7c3de33450a2f54a63d5e4b19386eab43a5b34d594268f3695"}, ] [[package]] name = "certifi" -version = "2025.7.14" +version = "2025.8.3" requires_python = ">=3.7" summary = "Python package for providing Mozilla's CA Bundle." groups = ["default", "dev"] files = [ - {file = "certifi-2025.7.14-py3-none-any.whl", hash = "sha256:6b31f564a415d79ee77df69d757bb49a5bb53bd9f756cbbe24394ffd6fc1f4b2"}, - {file = "certifi-2025.7.14.tar.gz", hash = "sha256:8ea99dbdfaaf2ba2f9bac77b9249ef62ec5218e7c2b2e903378ed5fccf765995"}, + {file = "certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5"}, + {file = "certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407"}, ] [[package]] name = "charset-normalizer" -version = "3.4.2" +version = "3.4.3" requires_python = ">=3.7" summary = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." groups = ["default", "dev"] files = [ - {file = "charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980"}, - {file = "charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0"}, - {file = "charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-win32.whl", hash = "sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-win32.whl", hash = "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c"}, + {file = "charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a"}, + {file = "charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14"}, ] [[package]] @@ -303,119 +308,161 @@ files = [ [[package]] name = "coverage" -version = "7.9.2" +version = "7.10.6" requires_python = ">=3.9" summary = "Code coverage measurement for Python" groups = ["dev"] files = [ - {file = "coverage-7.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a7a56a2964a9687b6aba5b5ced6971af308ef6f79a91043c05dd4ee3ebc3e9ba"}, - {file = "coverage-7.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:123d589f32c11d9be7fe2e66d823a236fe759b0096f5db3fb1b75b2fa414a4fa"}, - {file = "coverage-7.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:333b2e0ca576a7dbd66e85ab402e35c03b0b22f525eed82681c4b866e2e2653a"}, - {file = "coverage-7.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:326802760da234baf9f2f85a39e4a4b5861b94f6c8d95251f699e4f73b1835dc"}, - {file = "coverage-7.9.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19e7be4cfec248df38ce40968c95d3952fbffd57b400d4b9bb580f28179556d2"}, - {file = "coverage-7.9.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0b4a4cb73b9f2b891c1788711408ef9707666501ba23684387277ededab1097c"}, - {file = "coverage-7.9.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2c8937fa16c8c9fbbd9f118588756e7bcdc7e16a470766a9aef912dd3f117dbd"}, - {file = "coverage-7.9.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:42da2280c4d30c57a9b578bafd1d4494fa6c056d4c419d9689e66d775539be74"}, - {file = "coverage-7.9.2-cp311-cp311-win32.whl", hash = "sha256:14fa8d3da147f5fdf9d298cacc18791818f3f1a9f542c8958b80c228320e90c6"}, - {file = "coverage-7.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:549cab4892fc82004f9739963163fd3aac7a7b0df430669b75b86d293d2df2a7"}, - {file = "coverage-7.9.2-cp311-cp311-win_arm64.whl", hash = "sha256:c2667a2b913e307f06aa4e5677f01a9746cd08e4b35e14ebcde6420a9ebb4c62"}, - {file = "coverage-7.9.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ae9eb07f1cfacd9cfe8eaee6f4ff4b8a289a668c39c165cd0c8548484920ffc0"}, - {file = "coverage-7.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9ce85551f9a1119f02adc46d3014b5ee3f765deac166acf20dbb851ceb79b6f3"}, - {file = "coverage-7.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8f6389ac977c5fb322e0e38885fbbf901743f79d47f50db706e7644dcdcb6e1"}, - {file = "coverage-7.9.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff0d9eae8cdfcd58fe7893b88993723583a6ce4dfbfd9f29e001922544f95615"}, - {file = "coverage-7.9.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fae939811e14e53ed8a9818dad51d434a41ee09df9305663735f2e2d2d7d959b"}, - {file = "coverage-7.9.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:31991156251ec202c798501e0a42bbdf2169dcb0f137b1f5c0f4267f3fc68ef9"}, - {file = "coverage-7.9.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d0d67963f9cbfc7c7f96d4ac74ed60ecbebd2ea6eeb51887af0f8dce205e545f"}, - {file = "coverage-7.9.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:49b752a2858b10580969ec6af6f090a9a440a64a301ac1528d7ca5f7ed497f4d"}, - {file = "coverage-7.9.2-cp312-cp312-win32.whl", hash = "sha256:88d7598b8ee130f32f8a43198ee02edd16d7f77692fa056cb779616bbea1b355"}, - {file = "coverage-7.9.2-cp312-cp312-win_amd64.whl", hash = "sha256:9dfb070f830739ee49d7c83e4941cc767e503e4394fdecb3b54bfdac1d7662c0"}, - {file = "coverage-7.9.2-cp312-cp312-win_arm64.whl", hash = "sha256:4e2c058aef613e79df00e86b6d42a641c877211384ce5bd07585ed7ba71ab31b"}, - {file = "coverage-7.9.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:985abe7f242e0d7bba228ab01070fde1d6c8fa12f142e43debe9ed1dde686038"}, - {file = "coverage-7.9.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82c3939264a76d44fde7f213924021ed31f55ef28111a19649fec90c0f109e6d"}, - {file = "coverage-7.9.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae5d563e970dbe04382f736ec214ef48103d1b875967c89d83c6e3f21706d5b3"}, - {file = "coverage-7.9.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdd612e59baed2a93c8843c9a7cb902260f181370f1d772f4842987535071d14"}, - {file = "coverage-7.9.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:256ea87cb2a1ed992bcdfc349d8042dcea1b80436f4ddf6e246d6bee4b5d73b6"}, - {file = "coverage-7.9.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f44ae036b63c8ea432f610534a2668b0c3aee810e7037ab9d8ff6883de480f5b"}, - {file = "coverage-7.9.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:82d76ad87c932935417a19b10cfe7abb15fd3f923cfe47dbdaa74ef4e503752d"}, - {file = "coverage-7.9.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:619317bb86de4193debc712b9e59d5cffd91dc1d178627ab2a77b9870deb2868"}, - {file = "coverage-7.9.2-cp313-cp313-win32.whl", hash = "sha256:0a07757de9feb1dfafd16ab651e0f628fd7ce551604d1bf23e47e1ddca93f08a"}, - {file = "coverage-7.9.2-cp313-cp313-win_amd64.whl", hash = "sha256:115db3d1f4d3f35f5bb021e270edd85011934ff97c8797216b62f461dd69374b"}, - {file = "coverage-7.9.2-cp313-cp313-win_arm64.whl", hash = "sha256:48f82f889c80af8b2a7bb6e158d95a3fbec6a3453a1004d04e4f3b5945a02694"}, - {file = "coverage-7.9.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:55a28954545f9d2f96870b40f6c3386a59ba8ed50caf2d949676dac3ecab99f5"}, - {file = "coverage-7.9.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cdef6504637731a63c133bb2e6f0f0214e2748495ec15fe42d1e219d1b133f0b"}, - {file = "coverage-7.9.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcd5ebe66c7a97273d5d2ddd4ad0ed2e706b39630ed4b53e713d360626c3dbb3"}, - {file = "coverage-7.9.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9303aed20872d7a3c9cb39c5d2b9bdbe44e3a9a1aecb52920f7e7495410dfab8"}, - {file = "coverage-7.9.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc18ea9e417a04d1920a9a76fe9ebd2f43ca505b81994598482f938d5c315f46"}, - {file = "coverage-7.9.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6406cff19880aaaadc932152242523e892faff224da29e241ce2fca329866584"}, - {file = "coverage-7.9.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2d0d4f6ecdf37fcc19c88fec3e2277d5dee740fb51ffdd69b9579b8c31e4232e"}, - {file = "coverage-7.9.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c33624f50cf8de418ab2b4d6ca9eda96dc45b2c4231336bac91454520e8d1fac"}, - {file = "coverage-7.9.2-cp313-cp313t-win32.whl", hash = "sha256:1df6b76e737c6a92210eebcb2390af59a141f9e9430210595251fbaf02d46926"}, - {file = "coverage-7.9.2-cp313-cp313t-win_amd64.whl", hash = "sha256:f5fd54310b92741ebe00d9c0d1d7b2b27463952c022da6d47c175d246a98d1bd"}, - {file = "coverage-7.9.2-cp313-cp313t-win_arm64.whl", hash = "sha256:c48c2375287108c887ee87d13b4070a381c6537d30e8487b24ec721bf2a781cb"}, - {file = "coverage-7.9.2-pp39.pp310.pp311-none-any.whl", hash = "sha256:8a1166db2fb62473285bcb092f586e081e92656c7dfa8e9f62b4d39d7e6b5050"}, - {file = "coverage-7.9.2-py3-none-any.whl", hash = "sha256:e425cd5b00f6fc0ed7cdbd766c70be8baab4b7839e4d4fe5fac48581dd968ea4"}, - {file = "coverage-7.9.2.tar.gz", hash = "sha256:997024fa51e3290264ffd7492ec97d0690293ccd2b45a6cd7d82d945a4a80c8b"}, + {file = "coverage-7.10.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c706db3cabb7ceef779de68270150665e710b46d56372455cd741184f3868d8f"}, + {file = "coverage-7.10.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e0c38dc289e0508ef68ec95834cb5d2e96fdbe792eaccaa1bccac3966bbadcc"}, + {file = "coverage-7.10.6-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:752a3005a1ded28f2f3a6e8787e24f28d6abe176ca64677bcd8d53d6fe2ec08a"}, + {file = "coverage-7.10.6-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:689920ecfd60f992cafca4f5477d55720466ad2c7fa29bb56ac8d44a1ac2b47a"}, + {file = "coverage-7.10.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec98435796d2624d6905820a42f82149ee9fc4f2d45c2c5bc5a44481cc50db62"}, + {file = "coverage-7.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b37201ce4a458c7a758ecc4efa92fa8ed783c66e0fa3c42ae19fc454a0792153"}, + {file = "coverage-7.10.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2904271c80898663c810a6b067920a61dd8d38341244a3605bd31ab55250dad5"}, + {file = "coverage-7.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5aea98383463d6e1fa4e95416d8de66f2d0cb588774ee20ae1b28df826bcb619"}, + {file = "coverage-7.10.6-cp311-cp311-win32.whl", hash = "sha256:e3fb1fa01d3598002777dd259c0c2e6d9d5e10e7222976fc8e03992f972a2cba"}, + {file = "coverage-7.10.6-cp311-cp311-win_amd64.whl", hash = "sha256:f35ed9d945bece26553d5b4c8630453169672bea0050a564456eb88bdffd927e"}, + {file = "coverage-7.10.6-cp311-cp311-win_arm64.whl", hash = "sha256:99e1a305c7765631d74b98bf7dbf54eeea931f975e80f115437d23848ee8c27c"}, + {file = "coverage-7.10.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5b2dd6059938063a2c9fee1af729d4f2af28fd1a545e9b7652861f0d752ebcea"}, + {file = "coverage-7.10.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:388d80e56191bf846c485c14ae2bc8898aa3124d9d35903fef7d907780477634"}, + {file = "coverage-7.10.6-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:90cb5b1a4670662719591aa92d0095bb41714970c0b065b02a2610172dbf0af6"}, + {file = "coverage-7.10.6-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:961834e2f2b863a0e14260a9a273aff07ff7818ab6e66d2addf5628590c628f9"}, + {file = "coverage-7.10.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf9a19f5012dab774628491659646335b1928cfc931bf8d97b0d5918dd58033c"}, + {file = "coverage-7.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:99c4283e2a0e147b9c9cc6bc9c96124de9419d6044837e9799763a0e29a7321a"}, + {file = "coverage-7.10.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:282b1b20f45df57cc508c1e033403f02283adfb67d4c9c35a90281d81e5c52c5"}, + {file = "coverage-7.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cdbe264f11afd69841bd8c0d83ca10b5b32853263ee62e6ac6a0ab63895f972"}, + {file = "coverage-7.10.6-cp312-cp312-win32.whl", hash = "sha256:a517feaf3a0a3eca1ee985d8373135cfdedfbba3882a5eab4362bda7c7cf518d"}, + {file = "coverage-7.10.6-cp312-cp312-win_amd64.whl", hash = "sha256:856986eadf41f52b214176d894a7de05331117f6035a28ac0016c0f63d887629"}, + {file = "coverage-7.10.6-cp312-cp312-win_arm64.whl", hash = "sha256:acf36b8268785aad739443fa2780c16260ee3fa09d12b3a70f772ef100939d80"}, + {file = "coverage-7.10.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ffea0575345e9ee0144dfe5701aa17f3ba546f8c3bb48db62ae101afb740e7d6"}, + {file = "coverage-7.10.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:95d91d7317cde40a1c249d6b7382750b7e6d86fad9d8eaf4fa3f8f44cf171e80"}, + {file = "coverage-7.10.6-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3e23dd5408fe71a356b41baa82892772a4cefcf758f2ca3383d2aa39e1b7a003"}, + {file = "coverage-7.10.6-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0f3f56e4cb573755e96a16501a98bf211f100463d70275759e73f3cbc00d4f27"}, + {file = "coverage-7.10.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:db4a1d897bbbe7339946ffa2fe60c10cc81c43fab8b062d3fcb84188688174a4"}, + {file = "coverage-7.10.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d8fd7879082953c156d5b13c74aa6cca37f6a6f4747b39538504c3f9c63d043d"}, + {file = "coverage-7.10.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:28395ca3f71cd103b8c116333fa9db867f3a3e1ad6a084aa3725ae002b6583bc"}, + {file = "coverage-7.10.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:61c950fc33d29c91b9e18540e1aed7d9f6787cc870a3e4032493bbbe641d12fc"}, + {file = "coverage-7.10.6-cp313-cp313-win32.whl", hash = "sha256:160c00a5e6b6bdf4e5984b0ef21fc860bc94416c41b7df4d63f536d17c38902e"}, + {file = "coverage-7.10.6-cp313-cp313-win_amd64.whl", hash = "sha256:628055297f3e2aa181464c3808402887643405573eb3d9de060d81531fa79d32"}, + {file = "coverage-7.10.6-cp313-cp313-win_arm64.whl", hash = "sha256:df4ec1f8540b0bcbe26ca7dd0f541847cc8a108b35596f9f91f59f0c060bfdd2"}, + {file = "coverage-7.10.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c9a8b7a34a4de3ed987f636f71881cd3b8339f61118b1aa311fbda12741bff0b"}, + {file = "coverage-7.10.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8dd5af36092430c2b075cee966719898f2ae87b636cefb85a653f1d0ba5d5393"}, + {file = "coverage-7.10.6-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b0353b0f0850d49ada66fdd7d0c7cdb0f86b900bb9e367024fd14a60cecc1e27"}, + {file = "coverage-7.10.6-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d6b9ae13d5d3e8aeca9ca94198aa7b3ebbc5acfada557d724f2a1f03d2c0b0df"}, + {file = "coverage-7.10.6-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:675824a363cc05781b1527b39dc2587b8984965834a748177ee3c37b64ffeafb"}, + {file = "coverage-7.10.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:692d70ea725f471a547c305f0d0fc6a73480c62fb0da726370c088ab21aed282"}, + {file = "coverage-7.10.6-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:851430a9a361c7a8484a36126d1d0ff8d529d97385eacc8dfdc9bfc8c2d2cbe4"}, + {file = "coverage-7.10.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d9369a23186d189b2fc95cc08b8160ba242057e887d766864f7adf3c46b2df21"}, + {file = "coverage-7.10.6-cp313-cp313t-win32.whl", hash = "sha256:92be86fcb125e9bda0da7806afd29a3fd33fdf58fba5d60318399adf40bf37d0"}, + {file = "coverage-7.10.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6b3039e2ca459a70c79523d39347d83b73f2f06af5624905eba7ec34d64d80b5"}, + {file = "coverage-7.10.6-cp313-cp313t-win_arm64.whl", hash = "sha256:3fb99d0786fe17b228eab663d16bee2288e8724d26a199c29325aac4b0319b9b"}, + {file = "coverage-7.10.6-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6008a021907be8c4c02f37cdc3ffb258493bdebfeaf9a839f9e71dfdc47b018e"}, + {file = "coverage-7.10.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:5e75e37f23eb144e78940b40395b42f2321951206a4f50e23cfd6e8a198d3ceb"}, + {file = "coverage-7.10.6-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0f7cb359a448e043c576f0da00aa8bfd796a01b06aa610ca453d4dde09cc1034"}, + {file = "coverage-7.10.6-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c68018e4fc4e14b5668f1353b41ccf4bc83ba355f0e1b3836861c6f042d89ac1"}, + {file = "coverage-7.10.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cd4b2b0707fc55afa160cd5fc33b27ccbf75ca11d81f4ec9863d5793fc6df56a"}, + {file = "coverage-7.10.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4cec13817a651f8804a86e4f79d815b3b28472c910e099e4d5a0e8a3b6a1d4cb"}, + {file = "coverage-7.10.6-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:f2a6a8e06bbda06f78739f40bfb56c45d14eb8249d0f0ea6d4b3d48e1f7c695d"}, + {file = "coverage-7.10.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:081b98395ced0d9bcf60ada7661a0b75f36b78b9d7e39ea0790bb4ed8da14747"}, + {file = "coverage-7.10.6-cp314-cp314-win32.whl", hash = "sha256:6937347c5d7d069ee776b2bf4e1212f912a9f1f141a429c475e6089462fcecc5"}, + {file = "coverage-7.10.6-cp314-cp314-win_amd64.whl", hash = "sha256:adec1d980fa07e60b6ef865f9e5410ba760e4e1d26f60f7e5772c73b9a5b0713"}, + {file = "coverage-7.10.6-cp314-cp314-win_arm64.whl", hash = "sha256:a80f7aef9535442bdcf562e5a0d5a5538ce8abe6bb209cfbf170c462ac2c2a32"}, + {file = "coverage-7.10.6-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:0de434f4fbbe5af4fa7989521c655c8c779afb61c53ab561b64dcee6149e4c65"}, + {file = "coverage-7.10.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6e31b8155150c57e5ac43ccd289d079eb3f825187d7c66e755a055d2c85794c6"}, + {file = "coverage-7.10.6-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:98cede73eb83c31e2118ae8d379c12e3e42736903a8afcca92a7218e1f2903b0"}, + {file = "coverage-7.10.6-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f863c08f4ff6b64fa8045b1e3da480f5374779ef187f07b82e0538c68cb4ff8e"}, + {file = "coverage-7.10.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b38261034fda87be356f2c3f42221fdb4171c3ce7658066ae449241485390d5"}, + {file = "coverage-7.10.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0e93b1476b79eae849dc3872faeb0bf7948fd9ea34869590bc16a2a00b9c82a7"}, + {file = "coverage-7.10.6-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ff8a991f70f4c0cf53088abf1e3886edcc87d53004c7bb94e78650b4d3dac3b5"}, + {file = "coverage-7.10.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ac765b026c9f33044419cbba1da913cfb82cca1b60598ac1c7a5ed6aac4621a0"}, + {file = "coverage-7.10.6-cp314-cp314t-win32.whl", hash = "sha256:441c357d55f4936875636ef2cfb3bee36e466dcf50df9afbd398ce79dba1ebb7"}, + {file = "coverage-7.10.6-cp314-cp314t-win_amd64.whl", hash = "sha256:073711de3181b2e204e4870ac83a7c4853115b42e9cd4d145f2231e12d670930"}, + {file = "coverage-7.10.6-cp314-cp314t-win_arm64.whl", hash = "sha256:137921f2bac5559334ba66122b753db6dc5d1cf01eb7b64eb412bb0d064ef35b"}, + {file = "coverage-7.10.6-py3-none-any.whl", hash = "sha256:92c4ecf6bf11b2e85fd4d8204814dc26e6a19f0c9d938c207c5cb0eadfcabbe3"}, + {file = "coverage-7.10.6.tar.gz", hash = "sha256:f644a3ae5933a552a29dbb9aa2f90c677a875f80ebea028e5a52a4f429044b90"}, ] [[package]] name = "coverage" -version = "7.9.2" +version = "7.10.6" extras = ["toml"] requires_python = ">=3.9" summary = "Code coverage measurement for Python" groups = ["dev"] dependencies = [ - "coverage==7.9.2", + "coverage==7.10.6", "tomli; python_full_version <= \"3.11.0a6\"", ] files = [ - {file = "coverage-7.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a7a56a2964a9687b6aba5b5ced6971af308ef6f79a91043c05dd4ee3ebc3e9ba"}, - {file = "coverage-7.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:123d589f32c11d9be7fe2e66d823a236fe759b0096f5db3fb1b75b2fa414a4fa"}, - {file = "coverage-7.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:333b2e0ca576a7dbd66e85ab402e35c03b0b22f525eed82681c4b866e2e2653a"}, - {file = "coverage-7.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:326802760da234baf9f2f85a39e4a4b5861b94f6c8d95251f699e4f73b1835dc"}, - {file = "coverage-7.9.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19e7be4cfec248df38ce40968c95d3952fbffd57b400d4b9bb580f28179556d2"}, - {file = "coverage-7.9.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0b4a4cb73b9f2b891c1788711408ef9707666501ba23684387277ededab1097c"}, - {file = "coverage-7.9.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2c8937fa16c8c9fbbd9f118588756e7bcdc7e16a470766a9aef912dd3f117dbd"}, - {file = "coverage-7.9.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:42da2280c4d30c57a9b578bafd1d4494fa6c056d4c419d9689e66d775539be74"}, - {file = "coverage-7.9.2-cp311-cp311-win32.whl", hash = "sha256:14fa8d3da147f5fdf9d298cacc18791818f3f1a9f542c8958b80c228320e90c6"}, - {file = "coverage-7.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:549cab4892fc82004f9739963163fd3aac7a7b0df430669b75b86d293d2df2a7"}, - {file = "coverage-7.9.2-cp311-cp311-win_arm64.whl", hash = "sha256:c2667a2b913e307f06aa4e5677f01a9746cd08e4b35e14ebcde6420a9ebb4c62"}, - {file = "coverage-7.9.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ae9eb07f1cfacd9cfe8eaee6f4ff4b8a289a668c39c165cd0c8548484920ffc0"}, - {file = "coverage-7.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9ce85551f9a1119f02adc46d3014b5ee3f765deac166acf20dbb851ceb79b6f3"}, - {file = "coverage-7.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8f6389ac977c5fb322e0e38885fbbf901743f79d47f50db706e7644dcdcb6e1"}, - {file = "coverage-7.9.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff0d9eae8cdfcd58fe7893b88993723583a6ce4dfbfd9f29e001922544f95615"}, - {file = "coverage-7.9.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fae939811e14e53ed8a9818dad51d434a41ee09df9305663735f2e2d2d7d959b"}, - {file = "coverage-7.9.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:31991156251ec202c798501e0a42bbdf2169dcb0f137b1f5c0f4267f3fc68ef9"}, - {file = "coverage-7.9.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d0d67963f9cbfc7c7f96d4ac74ed60ecbebd2ea6eeb51887af0f8dce205e545f"}, - {file = "coverage-7.9.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:49b752a2858b10580969ec6af6f090a9a440a64a301ac1528d7ca5f7ed497f4d"}, - {file = "coverage-7.9.2-cp312-cp312-win32.whl", hash = "sha256:88d7598b8ee130f32f8a43198ee02edd16d7f77692fa056cb779616bbea1b355"}, - {file = "coverage-7.9.2-cp312-cp312-win_amd64.whl", hash = "sha256:9dfb070f830739ee49d7c83e4941cc767e503e4394fdecb3b54bfdac1d7662c0"}, - {file = "coverage-7.9.2-cp312-cp312-win_arm64.whl", hash = "sha256:4e2c058aef613e79df00e86b6d42a641c877211384ce5bd07585ed7ba71ab31b"}, - {file = "coverage-7.9.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:985abe7f242e0d7bba228ab01070fde1d6c8fa12f142e43debe9ed1dde686038"}, - {file = "coverage-7.9.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82c3939264a76d44fde7f213924021ed31f55ef28111a19649fec90c0f109e6d"}, - {file = "coverage-7.9.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae5d563e970dbe04382f736ec214ef48103d1b875967c89d83c6e3f21706d5b3"}, - {file = "coverage-7.9.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdd612e59baed2a93c8843c9a7cb902260f181370f1d772f4842987535071d14"}, - {file = "coverage-7.9.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:256ea87cb2a1ed992bcdfc349d8042dcea1b80436f4ddf6e246d6bee4b5d73b6"}, - {file = "coverage-7.9.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f44ae036b63c8ea432f610534a2668b0c3aee810e7037ab9d8ff6883de480f5b"}, - {file = "coverage-7.9.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:82d76ad87c932935417a19b10cfe7abb15fd3f923cfe47dbdaa74ef4e503752d"}, - {file = "coverage-7.9.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:619317bb86de4193debc712b9e59d5cffd91dc1d178627ab2a77b9870deb2868"}, - {file = "coverage-7.9.2-cp313-cp313-win32.whl", hash = "sha256:0a07757de9feb1dfafd16ab651e0f628fd7ce551604d1bf23e47e1ddca93f08a"}, - {file = "coverage-7.9.2-cp313-cp313-win_amd64.whl", hash = "sha256:115db3d1f4d3f35f5bb021e270edd85011934ff97c8797216b62f461dd69374b"}, - {file = "coverage-7.9.2-cp313-cp313-win_arm64.whl", hash = "sha256:48f82f889c80af8b2a7bb6e158d95a3fbec6a3453a1004d04e4f3b5945a02694"}, - {file = "coverage-7.9.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:55a28954545f9d2f96870b40f6c3386a59ba8ed50caf2d949676dac3ecab99f5"}, - {file = "coverage-7.9.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cdef6504637731a63c133bb2e6f0f0214e2748495ec15fe42d1e219d1b133f0b"}, - {file = "coverage-7.9.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcd5ebe66c7a97273d5d2ddd4ad0ed2e706b39630ed4b53e713d360626c3dbb3"}, - {file = "coverage-7.9.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9303aed20872d7a3c9cb39c5d2b9bdbe44e3a9a1aecb52920f7e7495410dfab8"}, - {file = "coverage-7.9.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc18ea9e417a04d1920a9a76fe9ebd2f43ca505b81994598482f938d5c315f46"}, - {file = "coverage-7.9.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6406cff19880aaaadc932152242523e892faff224da29e241ce2fca329866584"}, - {file = "coverage-7.9.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2d0d4f6ecdf37fcc19c88fec3e2277d5dee740fb51ffdd69b9579b8c31e4232e"}, - {file = "coverage-7.9.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c33624f50cf8de418ab2b4d6ca9eda96dc45b2c4231336bac91454520e8d1fac"}, - {file = "coverage-7.9.2-cp313-cp313t-win32.whl", hash = "sha256:1df6b76e737c6a92210eebcb2390af59a141f9e9430210595251fbaf02d46926"}, - {file = "coverage-7.9.2-cp313-cp313t-win_amd64.whl", hash = "sha256:f5fd54310b92741ebe00d9c0d1d7b2b27463952c022da6d47c175d246a98d1bd"}, - {file = "coverage-7.9.2-cp313-cp313t-win_arm64.whl", hash = "sha256:c48c2375287108c887ee87d13b4070a381c6537d30e8487b24ec721bf2a781cb"}, - {file = "coverage-7.9.2-pp39.pp310.pp311-none-any.whl", hash = "sha256:8a1166db2fb62473285bcb092f586e081e92656c7dfa8e9f62b4d39d7e6b5050"}, - {file = "coverage-7.9.2-py3-none-any.whl", hash = "sha256:e425cd5b00f6fc0ed7cdbd766c70be8baab4b7839e4d4fe5fac48581dd968ea4"}, - {file = "coverage-7.9.2.tar.gz", hash = "sha256:997024fa51e3290264ffd7492ec97d0690293ccd2b45a6cd7d82d945a4a80c8b"}, + {file = "coverage-7.10.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c706db3cabb7ceef779de68270150665e710b46d56372455cd741184f3868d8f"}, + {file = "coverage-7.10.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e0c38dc289e0508ef68ec95834cb5d2e96fdbe792eaccaa1bccac3966bbadcc"}, + {file = "coverage-7.10.6-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:752a3005a1ded28f2f3a6e8787e24f28d6abe176ca64677bcd8d53d6fe2ec08a"}, + {file = "coverage-7.10.6-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:689920ecfd60f992cafca4f5477d55720466ad2c7fa29bb56ac8d44a1ac2b47a"}, + {file = "coverage-7.10.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec98435796d2624d6905820a42f82149ee9fc4f2d45c2c5bc5a44481cc50db62"}, + {file = "coverage-7.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b37201ce4a458c7a758ecc4efa92fa8ed783c66e0fa3c42ae19fc454a0792153"}, + {file = "coverage-7.10.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2904271c80898663c810a6b067920a61dd8d38341244a3605bd31ab55250dad5"}, + {file = "coverage-7.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5aea98383463d6e1fa4e95416d8de66f2d0cb588774ee20ae1b28df826bcb619"}, + {file = "coverage-7.10.6-cp311-cp311-win32.whl", hash = "sha256:e3fb1fa01d3598002777dd259c0c2e6d9d5e10e7222976fc8e03992f972a2cba"}, + {file = "coverage-7.10.6-cp311-cp311-win_amd64.whl", hash = "sha256:f35ed9d945bece26553d5b4c8630453169672bea0050a564456eb88bdffd927e"}, + {file = "coverage-7.10.6-cp311-cp311-win_arm64.whl", hash = "sha256:99e1a305c7765631d74b98bf7dbf54eeea931f975e80f115437d23848ee8c27c"}, + {file = "coverage-7.10.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5b2dd6059938063a2c9fee1af729d4f2af28fd1a545e9b7652861f0d752ebcea"}, + {file = "coverage-7.10.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:388d80e56191bf846c485c14ae2bc8898aa3124d9d35903fef7d907780477634"}, + {file = "coverage-7.10.6-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:90cb5b1a4670662719591aa92d0095bb41714970c0b065b02a2610172dbf0af6"}, + {file = "coverage-7.10.6-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:961834e2f2b863a0e14260a9a273aff07ff7818ab6e66d2addf5628590c628f9"}, + {file = "coverage-7.10.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf9a19f5012dab774628491659646335b1928cfc931bf8d97b0d5918dd58033c"}, + {file = "coverage-7.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:99c4283e2a0e147b9c9cc6bc9c96124de9419d6044837e9799763a0e29a7321a"}, + {file = "coverage-7.10.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:282b1b20f45df57cc508c1e033403f02283adfb67d4c9c35a90281d81e5c52c5"}, + {file = "coverage-7.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cdbe264f11afd69841bd8c0d83ca10b5b32853263ee62e6ac6a0ab63895f972"}, + {file = "coverage-7.10.6-cp312-cp312-win32.whl", hash = "sha256:a517feaf3a0a3eca1ee985d8373135cfdedfbba3882a5eab4362bda7c7cf518d"}, + {file = "coverage-7.10.6-cp312-cp312-win_amd64.whl", hash = "sha256:856986eadf41f52b214176d894a7de05331117f6035a28ac0016c0f63d887629"}, + {file = "coverage-7.10.6-cp312-cp312-win_arm64.whl", hash = "sha256:acf36b8268785aad739443fa2780c16260ee3fa09d12b3a70f772ef100939d80"}, + {file = "coverage-7.10.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ffea0575345e9ee0144dfe5701aa17f3ba546f8c3bb48db62ae101afb740e7d6"}, + {file = "coverage-7.10.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:95d91d7317cde40a1c249d6b7382750b7e6d86fad9d8eaf4fa3f8f44cf171e80"}, + {file = "coverage-7.10.6-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3e23dd5408fe71a356b41baa82892772a4cefcf758f2ca3383d2aa39e1b7a003"}, + {file = "coverage-7.10.6-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0f3f56e4cb573755e96a16501a98bf211f100463d70275759e73f3cbc00d4f27"}, + {file = "coverage-7.10.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:db4a1d897bbbe7339946ffa2fe60c10cc81c43fab8b062d3fcb84188688174a4"}, + {file = "coverage-7.10.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d8fd7879082953c156d5b13c74aa6cca37f6a6f4747b39538504c3f9c63d043d"}, + {file = "coverage-7.10.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:28395ca3f71cd103b8c116333fa9db867f3a3e1ad6a084aa3725ae002b6583bc"}, + {file = "coverage-7.10.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:61c950fc33d29c91b9e18540e1aed7d9f6787cc870a3e4032493bbbe641d12fc"}, + {file = "coverage-7.10.6-cp313-cp313-win32.whl", hash = "sha256:160c00a5e6b6bdf4e5984b0ef21fc860bc94416c41b7df4d63f536d17c38902e"}, + {file = "coverage-7.10.6-cp313-cp313-win_amd64.whl", hash = "sha256:628055297f3e2aa181464c3808402887643405573eb3d9de060d81531fa79d32"}, + {file = "coverage-7.10.6-cp313-cp313-win_arm64.whl", hash = "sha256:df4ec1f8540b0bcbe26ca7dd0f541847cc8a108b35596f9f91f59f0c060bfdd2"}, + {file = "coverage-7.10.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c9a8b7a34a4de3ed987f636f71881cd3b8339f61118b1aa311fbda12741bff0b"}, + {file = "coverage-7.10.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8dd5af36092430c2b075cee966719898f2ae87b636cefb85a653f1d0ba5d5393"}, + {file = "coverage-7.10.6-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b0353b0f0850d49ada66fdd7d0c7cdb0f86b900bb9e367024fd14a60cecc1e27"}, + {file = "coverage-7.10.6-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d6b9ae13d5d3e8aeca9ca94198aa7b3ebbc5acfada557d724f2a1f03d2c0b0df"}, + {file = "coverage-7.10.6-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:675824a363cc05781b1527b39dc2587b8984965834a748177ee3c37b64ffeafb"}, + {file = "coverage-7.10.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:692d70ea725f471a547c305f0d0fc6a73480c62fb0da726370c088ab21aed282"}, + {file = "coverage-7.10.6-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:851430a9a361c7a8484a36126d1d0ff8d529d97385eacc8dfdc9bfc8c2d2cbe4"}, + {file = "coverage-7.10.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d9369a23186d189b2fc95cc08b8160ba242057e887d766864f7adf3c46b2df21"}, + {file = "coverage-7.10.6-cp313-cp313t-win32.whl", hash = "sha256:92be86fcb125e9bda0da7806afd29a3fd33fdf58fba5d60318399adf40bf37d0"}, + {file = "coverage-7.10.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6b3039e2ca459a70c79523d39347d83b73f2f06af5624905eba7ec34d64d80b5"}, + {file = "coverage-7.10.6-cp313-cp313t-win_arm64.whl", hash = "sha256:3fb99d0786fe17b228eab663d16bee2288e8724d26a199c29325aac4b0319b9b"}, + {file = "coverage-7.10.6-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6008a021907be8c4c02f37cdc3ffb258493bdebfeaf9a839f9e71dfdc47b018e"}, + {file = "coverage-7.10.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:5e75e37f23eb144e78940b40395b42f2321951206a4f50e23cfd6e8a198d3ceb"}, + {file = "coverage-7.10.6-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0f7cb359a448e043c576f0da00aa8bfd796a01b06aa610ca453d4dde09cc1034"}, + {file = "coverage-7.10.6-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c68018e4fc4e14b5668f1353b41ccf4bc83ba355f0e1b3836861c6f042d89ac1"}, + {file = "coverage-7.10.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cd4b2b0707fc55afa160cd5fc33b27ccbf75ca11d81f4ec9863d5793fc6df56a"}, + {file = "coverage-7.10.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4cec13817a651f8804a86e4f79d815b3b28472c910e099e4d5a0e8a3b6a1d4cb"}, + {file = "coverage-7.10.6-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:f2a6a8e06bbda06f78739f40bfb56c45d14eb8249d0f0ea6d4b3d48e1f7c695d"}, + {file = "coverage-7.10.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:081b98395ced0d9bcf60ada7661a0b75f36b78b9d7e39ea0790bb4ed8da14747"}, + {file = "coverage-7.10.6-cp314-cp314-win32.whl", hash = "sha256:6937347c5d7d069ee776b2bf4e1212f912a9f1f141a429c475e6089462fcecc5"}, + {file = "coverage-7.10.6-cp314-cp314-win_amd64.whl", hash = "sha256:adec1d980fa07e60b6ef865f9e5410ba760e4e1d26f60f7e5772c73b9a5b0713"}, + {file = "coverage-7.10.6-cp314-cp314-win_arm64.whl", hash = "sha256:a80f7aef9535442bdcf562e5a0d5a5538ce8abe6bb209cfbf170c462ac2c2a32"}, + {file = "coverage-7.10.6-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:0de434f4fbbe5af4fa7989521c655c8c779afb61c53ab561b64dcee6149e4c65"}, + {file = "coverage-7.10.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6e31b8155150c57e5ac43ccd289d079eb3f825187d7c66e755a055d2c85794c6"}, + {file = "coverage-7.10.6-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:98cede73eb83c31e2118ae8d379c12e3e42736903a8afcca92a7218e1f2903b0"}, + {file = "coverage-7.10.6-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f863c08f4ff6b64fa8045b1e3da480f5374779ef187f07b82e0538c68cb4ff8e"}, + {file = "coverage-7.10.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b38261034fda87be356f2c3f42221fdb4171c3ce7658066ae449241485390d5"}, + {file = "coverage-7.10.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0e93b1476b79eae849dc3872faeb0bf7948fd9ea34869590bc16a2a00b9c82a7"}, + {file = "coverage-7.10.6-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ff8a991f70f4c0cf53088abf1e3886edcc87d53004c7bb94e78650b4d3dac3b5"}, + {file = "coverage-7.10.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ac765b026c9f33044419cbba1da913cfb82cca1b60598ac1c7a5ed6aac4621a0"}, + {file = "coverage-7.10.6-cp314-cp314t-win32.whl", hash = "sha256:441c357d55f4936875636ef2cfb3bee36e466dcf50df9afbd398ce79dba1ebb7"}, + {file = "coverage-7.10.6-cp314-cp314t-win_amd64.whl", hash = "sha256:073711de3181b2e204e4870ac83a7c4853115b42e9cd4d145f2231e12d670930"}, + {file = "coverage-7.10.6-cp314-cp314t-win_arm64.whl", hash = "sha256:137921f2bac5559334ba66122b753db6dc5d1cf01eb7b64eb412bb0d064ef35b"}, + {file = "coverage-7.10.6-py3-none-any.whl", hash = "sha256:92c4ecf6bf11b2e85fd4d8204814dc26e6a19f0c9d938c207c5cb0eadfcabbe3"}, + {file = "coverage-7.10.6.tar.gz", hash = "sha256:f644a3ae5933a552a29dbb9aa2f90c677a875f80ebea028e5a52a4f429044b90"}, ] [[package]] @@ -572,7 +619,7 @@ files = [ [[package]] name = "jsonschema" -version = "4.25.0" +version = "4.25.1" requires_python = ">=3.9" summary = "An implementation of JSON Schema validation for Python" groups = ["default"] @@ -583,13 +630,13 @@ dependencies = [ "rpds-py>=0.7.1", ] files = [ - {file = "jsonschema-4.25.0-py3-none-any.whl", hash = "sha256:24c2e8da302de79c8b9382fee3e76b355e44d2a4364bb207159ce10b517bd716"}, - {file = "jsonschema-4.25.0.tar.gz", hash = "sha256:e63acf5c11762c0e6672ffb61482bdf57f0876684d8d249c0fe2d730d48bc55f"}, + {file = "jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63"}, + {file = "jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85"}, ] [[package]] name = "jsonschema-specifications" -version = "2025.4.1" +version = "2025.9.1" requires_python = ">=3.9" summary = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" groups = ["default"] @@ -597,8 +644,8 @@ dependencies = [ "referencing>=0.31.0", ] files = [ - {file = "jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af"}, - {file = "jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608"}, + {file = "jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe"}, + {file = "jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d"}, ] [[package]] @@ -689,13 +736,13 @@ files = [ [[package]] name = "platformdirs" -version = "4.3.8" +version = "4.4.0" requires_python = ">=3.9" summary = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." groups = ["default"] files = [ - {file = "platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4"}, - {file = "platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc"}, + {file = "platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85"}, + {file = "platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf"}, ] [[package]] @@ -822,25 +869,25 @@ files = [ [[package]] name = "pyrefly" -version = "0.24.2" +version = "0.32.0" requires_python = ">=3.8" summary = "A fast Python type checker written in Rust" groups = ["dev"] files = [ - {file = "pyrefly-0.24.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:7e6bd1b88ec53b3f1ce2ece844016d7e7f0848a77022857a7fa6674a49abcc13"}, - {file = "pyrefly-0.24.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:83aa9013f2299dfc8ce11adec30a63be71528484c45e603375efe7496cb0538e"}, - {file = "pyrefly-0.24.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3bf1689032b78f8f653244cd323ee1e06a0efb6192c4d7a415d1e85aedd37905"}, - {file = "pyrefly-0.24.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8404b804a5a1bc4a54cc8e58bceacdf49d7221531843c068547241d8f476af24"}, - {file = "pyrefly-0.24.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14d09f166a46e43655ea812611887ca16a0c54386296f4c9333f3f5fc7236709"}, - {file = "pyrefly-0.24.2-py3-none-win32.whl", hash = "sha256:6c602df48dcfa3240f9076c7d1e9cf9dc2d94c90ee5b4c6745f3734125a2cf3a"}, - {file = "pyrefly-0.24.2-py3-none-win_amd64.whl", hash = "sha256:9ed4690716eb47077082d4e99624e0a1165b9ac93300c8d823f42cae12ec1ef4"}, - {file = "pyrefly-0.24.2-py3-none-win_arm64.whl", hash = "sha256:96ba49c02f374d716b8674409aa653093dad5263cf4e429a1d5ec603064db715"}, - {file = "pyrefly-0.24.2.tar.gz", hash = "sha256:671b9933c2a3f646983de68bc0422736f7ce364c4f645f742559423b0b9b5150"}, + {file = "pyrefly-0.32.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e6711bddd2d2bb548cb569eef2c35c1ce88de00c2b4008a84a49ad3f666e70ef"}, + {file = "pyrefly-0.32.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5bfdc3aa86a80c50d8496189d908a6b9faebebd1e9716e72fb3e165a8a1ce492"}, + {file = "pyrefly-0.32.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f88311fcd910b416f78af8138d38a9ff213a0abf7b2197d940607eff94870d1"}, + {file = "pyrefly-0.32.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:426a36eb7e6f7ad3b7b7d51811223ca6eeee5248ccfa80295843faa93936eecf"}, + {file = "pyrefly-0.32.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35eb677342c562be63c087f4d3c729d4307c8fb0b098f9ef17eecdf7b2815a6e"}, + {file = "pyrefly-0.32.0-py3-none-win32.whl", hash = "sha256:5ec5a91303532901b786f6bd3eed305b6bcf08f43991b8d278a0d0c7b777e676"}, + {file = "pyrefly-0.32.0-py3-none-win_amd64.whl", hash = "sha256:dbfeefbec4dea98e39f582f36d27cae6e1838122a45231cc664a1d3603792da3"}, + {file = "pyrefly-0.32.0-py3-none-win_arm64.whl", hash = "sha256:e053380a804412d4cf4312c93fda8ce0cbb789ffd8c250f96ca09598e44788a9"}, + {file = "pyrefly-0.32.0.tar.gz", hash = "sha256:99cfca29ed2ffa0663827fc30a10f8ed5f67937dcc7d3b53533a1fa625cb92b5"}, ] [[package]] name = "pyright" -version = "1.1.403" +version = "1.1.405" requires_python = ">=3.7" summary = "Command line wrapper for pyright" groups = ["dev"] @@ -849,13 +896,13 @@ dependencies = [ "typing-extensions>=4.1", ] files = [ - {file = "pyright-1.1.403-py3-none-any.whl", hash = "sha256:c0eeca5aa76cbef3fcc271259bbd785753c7ad7bcac99a9162b4c4c7daed23b3"}, - {file = "pyright-1.1.403.tar.gz", hash = "sha256:3ab69b9f41c67fb5bbb4d7a36243256f0d549ed3608678d381d5f51863921104"}, + {file = "pyright-1.1.405-py3-none-any.whl", hash = "sha256:a2cb13700b5508ce8e5d4546034cb7ea4aedb60215c6c33f56cec7f53996035a"}, + {file = "pyright-1.1.405.tar.gz", hash = "sha256:5c2a30e1037af27eb463a1cc0b9f6d65fec48478ccf092c1ac28385a15c55763"}, ] [[package]] name = "pytest" -version = "8.4.1" +version = "8.4.2" requires_python = ">=3.9" summary = "pytest: simple powerful testing with Python" groups = ["dev"] @@ -869,13 +916,13 @@ dependencies = [ "tomli>=1; python_version < \"3.11\"", ] files = [ - {file = "pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7"}, - {file = "pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c"}, + {file = "pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79"}, + {file = "pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01"}, ] [[package]] name = "pytest-cov" -version = "6.2.1" +version = "6.3.0" requires_python = ">=3.9" summary = "Pytest plugin for measuring coverage." groups = ["dev"] @@ -885,8 +932,8 @@ dependencies = [ "pytest>=6.2.5", ] files = [ - {file = "pytest_cov-6.2.1-py3-none-any.whl", hash = "sha256:f5bc4c23f42f1cdd23c70b1dab1bbaef4fc505ba950d53e0081d0730dd7e86d5"}, - {file = "pytest_cov-6.2.1.tar.gz", hash = "sha256:25cc6cc0a5358204b8108ecedc51a9b57b34cc6b8c967cc2c01a4e00d8a67da2"}, + {file = "pytest_cov-6.3.0-py3-none-any.whl", hash = "sha256:440db28156d2468cafc0415b4f8e50856a0d11faefa38f30906048fe490f1749"}, + {file = "pytest_cov-6.3.0.tar.gz", hash = "sha256:35c580e7800f87ce892e687461166e1ac2bcb8fb9e13aea79032518d6e503ff2"}, ] [[package]] @@ -966,8 +1013,8 @@ files = [ [[package]] name = "requests" -version = "2.32.4" -requires_python = ">=3.8" +version = "2.32.5" +requires_python = ">=3.9" summary = "Python HTTP for Humans." groups = ["default", "dev"] dependencies = [ @@ -977,8 +1024,8 @@ dependencies = [ "urllib3<3,>=1.21.1", ] files = [ - {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"}, - {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"}, + {file = "requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6"}, + {file = "requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"}, ] [[package]] @@ -994,132 +1041,140 @@ files = [ [[package]] name = "rpds-py" -version = "0.26.0" +version = "0.27.1" requires_python = ">=3.9" summary = "Python bindings to Rust's persistent data structures (rpds)" groups = ["default"] files = [ - {file = "rpds_py-0.26.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:9e8cb77286025bdb21be2941d64ac6ca016130bfdcd228739e8ab137eb4406ed"}, - {file = "rpds_py-0.26.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5e09330b21d98adc8ccb2dbb9fc6cb434e8908d4c119aeaa772cb1caab5440a0"}, - {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9c1b92b774b2e68d11193dc39620d62fd8ab33f0a3c77ecdabe19c179cdbc1"}, - {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:824e6d3503ab990d7090768e4dfd9e840837bae057f212ff9f4f05ec6d1975e7"}, - {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ad7fd2258228bf288f2331f0a6148ad0186b2e3643055ed0db30990e59817a6"}, - {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0dc23bbb3e06ec1ea72d515fb572c1fea59695aefbffb106501138762e1e915e"}, - {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d80bf832ac7b1920ee29a426cdca335f96a2b5caa839811803e999b41ba9030d"}, - {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0919f38f5542c0a87e7b4afcafab6fd2c15386632d249e9a087498571250abe3"}, - {file = "rpds_py-0.26.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d422b945683e409000c888e384546dbab9009bb92f7c0b456e217988cf316107"}, - {file = "rpds_py-0.26.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:77a7711fa562ba2da1aa757e11024ad6d93bad6ad7ede5afb9af144623e5f76a"}, - {file = "rpds_py-0.26.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238e8c8610cb7c29460e37184f6799547f7e09e6a9bdbdab4e8edb90986a2318"}, - {file = "rpds_py-0.26.0-cp311-cp311-win32.whl", hash = "sha256:893b022bfbdf26d7bedb083efeea624e8550ca6eb98bf7fea30211ce95b9201a"}, - {file = "rpds_py-0.26.0-cp311-cp311-win_amd64.whl", hash = "sha256:87a5531de9f71aceb8af041d72fc4cab4943648d91875ed56d2e629bef6d4c03"}, - {file = "rpds_py-0.26.0-cp311-cp311-win_arm64.whl", hash = "sha256:de2713f48c1ad57f89ac25b3cb7daed2156d8e822cf0eca9b96a6f990718cc41"}, - {file = "rpds_py-0.26.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:894514d47e012e794f1350f076c427d2347ebf82f9b958d554d12819849a369d"}, - {file = "rpds_py-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc921b96fa95a097add244da36a1d9e4f3039160d1d30f1b35837bf108c21136"}, - {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e1157659470aa42a75448b6e943c895be8c70531c43cb78b9ba990778955582"}, - {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:521ccf56f45bb3a791182dc6b88ae5f8fa079dd705ee42138c76deb1238e554e"}, - {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9def736773fd56b305c0eef698be5192c77bfa30d55a0e5885f80126c4831a15"}, - {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdad4ea3b4513b475e027be79e5a0ceac8ee1c113a1a11e5edc3c30c29f964d8"}, - {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82b165b07f416bdccf5c84546a484cc8f15137ca38325403864bfdf2b5b72f6a"}, - {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d04cab0a54b9dba4d278fe955a1390da3cf71f57feb78ddc7cb67cbe0bd30323"}, - {file = "rpds_py-0.26.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:79061ba1a11b6a12743a2b0f72a46aa2758613d454aa6ba4f5a265cc48850158"}, - {file = "rpds_py-0.26.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f405c93675d8d4c5ac87364bb38d06c988e11028a64b52a47158a355079661f3"}, - {file = "rpds_py-0.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dafd4c44b74aa4bed4b250f1aed165b8ef5de743bcca3b88fc9619b6087093d2"}, - {file = "rpds_py-0.26.0-cp312-cp312-win32.whl", hash = "sha256:3da5852aad63fa0c6f836f3359647870e21ea96cf433eb393ffa45263a170d44"}, - {file = "rpds_py-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf47cfdabc2194a669dcf7a8dbba62e37a04c5041d2125fae0233b720da6f05c"}, - {file = "rpds_py-0.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:20ab1ae4fa534f73647aad289003f1104092890849e0266271351922ed5574f8"}, - {file = "rpds_py-0.26.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:696764a5be111b036256c0b18cd29783fab22154690fc698062fc1b0084b511d"}, - {file = "rpds_py-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e6c15d2080a63aaed876e228efe4f814bc7889c63b1e112ad46fdc8b368b9e1"}, - {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390e3170babf42462739a93321e657444f0862c6d722a291accc46f9d21ed04e"}, - {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7da84c2c74c0f5bc97d853d9e17bb83e2dcafcff0dc48286916001cc114379a1"}, - {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c5fe114a6dd480a510b6d3661d09d67d1622c4bf20660a474507aaee7eeeee9"}, - {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3100b3090269f3a7ea727b06a6080d4eb7439dca4c0e91a07c5d133bb1727ea7"}, - {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c03c9b0c64afd0320ae57de4c982801271c0c211aa2d37f3003ff5feb75bb04"}, - {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5963b72ccd199ade6ee493723d18a3f21ba7d5b957017607f815788cef50eaf1"}, - {file = "rpds_py-0.26.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da4e873860ad5bab3291438525cae80169daecbfafe5657f7f5fb4d6b3f96b9"}, - {file = "rpds_py-0.26.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5afaddaa8e8c7f1f7b4c5c725c0070b6eed0228f705b90a1732a48e84350f4e9"}, - {file = "rpds_py-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4916dc96489616a6f9667e7526af8fa693c0fdb4f3acb0e5d9f4400eb06a47ba"}, - {file = "rpds_py-0.26.0-cp313-cp313-win32.whl", hash = "sha256:2a343f91b17097c546b93f7999976fd6c9d5900617aa848c81d794e062ab302b"}, - {file = "rpds_py-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:0a0b60701f2300c81b2ac88a5fb893ccfa408e1c4a555a77f908a2596eb875a5"}, - {file = "rpds_py-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:257d011919f133a4746958257f2c75238e3ff54255acd5e3e11f3ff41fd14256"}, - {file = "rpds_py-0.26.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:529c8156d7506fba5740e05da8795688f87119cce330c244519cf706a4a3d618"}, - {file = "rpds_py-0.26.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f53ec51f9d24e9638a40cabb95078ade8c99251945dad8d57bf4aabe86ecee35"}, - {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab504c4d654e4a29558eaa5bb8cea5fdc1703ea60a8099ffd9c758472cf913f"}, - {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd0641abca296bc1a00183fe44f7fced8807ed49d501f188faa642d0e4975b83"}, - {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b312fecc1d017b5327afa81d4da1480f51c68810963a7336d92203dbb3d4f1"}, - {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c741107203954f6fc34d3066d213d0a0c40f7bb5aafd698fb39888af277c70d8"}, - {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3e55a7db08dc9a6ed5fb7103019d2c1a38a349ac41901f9f66d7f95750942f"}, - {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e851920caab2dbcae311fd28f4313c6953993893eb5c1bb367ec69d9a39e7ed"}, - {file = "rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dfbf280da5f876d0b00c81f26bedce274e72a678c28845453885a9b3c22ae632"}, - {file = "rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1cc81d14ddfa53d7f3906694d35d54d9d3f850ef8e4e99ee68bc0d1e5fed9a9c"}, - {file = "rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dca83c498b4650a91efcf7b88d669b170256bf8017a5db6f3e06c2bf031f57e0"}, - {file = "rpds_py-0.26.0-cp313-cp313t-win32.whl", hash = "sha256:4d11382bcaf12f80b51d790dee295c56a159633a8e81e6323b16e55d81ae37e9"}, - {file = "rpds_py-0.26.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff110acded3c22c033e637dd8896e411c7d3a11289b2edf041f86663dbc791e9"}, - {file = "rpds_py-0.26.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:da619979df60a940cd434084355c514c25cf8eb4cf9a508510682f6c851a4f7a"}, - {file = "rpds_py-0.26.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ea89a2458a1a75f87caabefe789c87539ea4e43b40f18cff526052e35bbb4fdf"}, - {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feac1045b3327a45944e7dcbeb57530339f6b17baff154df51ef8b0da34c8c12"}, - {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b818a592bd69bfe437ee8368603d4a2d928c34cffcdf77c2e761a759ffd17d20"}, - {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a8b0dd8648709b62d9372fc00a57466f5fdeefed666afe3fea5a6c9539a0331"}, - {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d3498ad0df07d81112aa6ec6c95a7e7b1ae00929fb73e7ebee0f3faaeabad2f"}, - {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24a4146ccb15be237fdef10f331c568e1b0e505f8c8c9ed5d67759dac58ac246"}, - {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a9a63785467b2d73635957d32a4f6e73d5e4df497a16a6392fa066b753e87387"}, - {file = "rpds_py-0.26.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:de4ed93a8c91debfd5a047be327b7cc8b0cc6afe32a716bbbc4aedca9e2a83af"}, - {file = "rpds_py-0.26.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:caf51943715b12af827696ec395bfa68f090a4c1a1d2509eb4e2cb69abbbdb33"}, - {file = "rpds_py-0.26.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4a59e5bc386de021f56337f757301b337d7ab58baa40174fb150accd480bc953"}, - {file = "rpds_py-0.26.0-cp314-cp314-win32.whl", hash = "sha256:92c8db839367ef16a662478f0a2fe13e15f2227da3c1430a782ad0f6ee009ec9"}, - {file = "rpds_py-0.26.0-cp314-cp314-win_amd64.whl", hash = "sha256:b0afb8cdd034150d4d9f53926226ed27ad15b7f465e93d7468caaf5eafae0d37"}, - {file = "rpds_py-0.26.0-cp314-cp314-win_arm64.whl", hash = "sha256:ca3f059f4ba485d90c8dc75cb5ca897e15325e4e609812ce57f896607c1c0867"}, - {file = "rpds_py-0.26.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:5afea17ab3a126006dc2f293b14ffc7ef3c85336cf451564a0515ed7648033da"}, - {file = "rpds_py-0.26.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:69f0c0a3df7fd3a7eec50a00396104bb9a843ea6d45fcc31c2d5243446ffd7a7"}, - {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:801a71f70f9813e82d2513c9a96532551fce1e278ec0c64610992c49c04c2dad"}, - {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df52098cde6d5e02fa75c1f6244f07971773adb4a26625edd5c18fee906fa84d"}, - {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bc596b30f86dc6f0929499c9e574601679d0341a0108c25b9b358a042f51bca"}, - {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9dfbe56b299cf5875b68eb6f0ebaadc9cac520a1989cac0db0765abfb3709c19"}, - {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac64f4b2bdb4ea622175c9ab7cf09444e412e22c0e02e906978b3b488af5fde8"}, - {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:181ef9b6bbf9845a264f9aa45c31836e9f3c1f13be565d0d010e964c661d1e2b"}, - {file = "rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:49028aa684c144ea502a8e847d23aed5e4c2ef7cadfa7d5eaafcb40864844b7a"}, - {file = "rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e5d524d68a474a9688336045bbf76cb0def88549c1b2ad9dbfec1fb7cfbe9170"}, - {file = "rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c1851f429b822831bd2edcbe0cfd12ee9ea77868f8d3daf267b189371671c80e"}, - {file = "rpds_py-0.26.0-cp314-cp314t-win32.whl", hash = "sha256:7bdb17009696214c3b66bb3590c6d62e14ac5935e53e929bcdbc5a495987a84f"}, - {file = "rpds_py-0.26.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f14440b9573a6f76b4ee4770c13f0b5921f71dde3b6fcb8dabbefd13b7fe05d7"}, - {file = "rpds_py-0.26.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f61a9326f80ca59214d1cceb0a09bb2ece5b2563d4e0cd37bfd5515c28510674"}, - {file = "rpds_py-0.26.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:183f857a53bcf4b1b42ef0f57ca553ab56bdd170e49d8091e96c51c3d69ca696"}, - {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:941c1cfdf4799d623cf3aa1d326a6b4fdb7a5799ee2687f3516738216d2262fb"}, - {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72a8d9564a717ee291f554eeb4bfeafe2309d5ec0aa6c475170bdab0f9ee8e88"}, - {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:511d15193cbe013619dd05414c35a7dedf2088fcee93c6bbb7c77859765bd4e8"}, - {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aea1f9741b603a8d8fedb0ed5502c2bc0accbc51f43e2ad1337fe7259c2b77a5"}, - {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4019a9d473c708cf2f16415688ef0b4639e07abaa569d72f74745bbeffafa2c7"}, - {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:093d63b4b0f52d98ebae33b8c50900d3d67e0666094b1be7a12fffd7f65de74b"}, - {file = "rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2abe21d8ba64cded53a2a677e149ceb76dcf44284202d737178afe7ba540c1eb"}, - {file = "rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:4feb7511c29f8442cbbc28149a92093d32e815a28aa2c50d333826ad2a20fdf0"}, - {file = "rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e99685fc95d386da368013e7fb4269dd39c30d99f812a8372d62f244f662709c"}, - {file = "rpds_py-0.26.0.tar.gz", hash = "sha256:20dae58a859b0906f0685642e591056f1e787f3a8b39c8e8749a45dc7d26bdb0"}, + {file = "rpds_py-0.27.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:be898f271f851f68b318872ce6ebebbc62f303b654e43bf72683dbdc25b7c881"}, + {file = "rpds_py-0.27.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:62ac3d4e3e07b58ee0ddecd71d6ce3b1637de2d373501412df395a0ec5f9beb5"}, + {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4708c5c0ceb2d034f9991623631d3d23cb16e65c83736ea020cdbe28d57c0a0e"}, + {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:abfa1171a9952d2e0002aba2ad3780820b00cc3d9c98c6630f2e93271501f66c"}, + {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b507d19f817ebaca79574b16eb2ae412e5c0835542c93fe9983f1e432aca195"}, + {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:168b025f8fd8d8d10957405f3fdcef3dc20f5982d398f90851f4abc58c566c52"}, + {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb56c6210ef77caa58e16e8c17d35c63fe3f5b60fd9ba9d424470c3400bcf9ed"}, + {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:d252f2d8ca0195faa707f8eb9368955760880b2b42a8ee16d382bf5dd807f89a"}, + {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6e5e54da1e74b91dbc7996b56640f79b195d5925c2b78efaa8c5d53e1d88edde"}, + {file = "rpds_py-0.27.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ffce0481cc6e95e5b3f0a47ee17ffbd234399e6d532f394c8dce320c3b089c21"}, + {file = "rpds_py-0.27.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a205fdfe55c90c2cd8e540ca9ceba65cbe6629b443bc05db1f590a3db8189ff9"}, + {file = "rpds_py-0.27.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:689fb5200a749db0415b092972e8eba85847c23885c8543a8b0f5c009b1a5948"}, + {file = "rpds_py-0.27.1-cp311-cp311-win32.whl", hash = "sha256:3182af66048c00a075010bc7f4860f33913528a4b6fc09094a6e7598e462fe39"}, + {file = "rpds_py-0.27.1-cp311-cp311-win_amd64.whl", hash = "sha256:b4938466c6b257b2f5c4ff98acd8128ec36b5059e5c8f8372d79316b1c36bb15"}, + {file = "rpds_py-0.27.1-cp311-cp311-win_arm64.whl", hash = "sha256:2f57af9b4d0793e53266ee4325535a31ba48e2f875da81a9177c9926dfa60746"}, + {file = "rpds_py-0.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ae2775c1973e3c30316892737b91f9283f9908e3cc7625b9331271eaaed7dc90"}, + {file = "rpds_py-0.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2643400120f55c8a96f7c9d858f7be0c88d383cd4653ae2cf0d0c88f668073e5"}, + {file = "rpds_py-0.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16323f674c089b0360674a4abd28d5042947d54ba620f72514d69be4ff64845e"}, + {file = "rpds_py-0.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a1f4814b65eacac94a00fc9a526e3fdafd78e439469644032032d0d63de4881"}, + {file = "rpds_py-0.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ba32c16b064267b22f1850a34051121d423b6f7338a12b9459550eb2096e7ec"}, + {file = "rpds_py-0.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5c20f33fd10485b80f65e800bbe5f6785af510b9f4056c5a3c612ebc83ba6cb"}, + {file = "rpds_py-0.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:466bfe65bd932da36ff279ddd92de56b042f2266d752719beb97b08526268ec5"}, + {file = "rpds_py-0.27.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:41e532bbdcb57c92ba3be62c42e9f096431b4cf478da9bc3bc6ce5c38ab7ba7a"}, + {file = "rpds_py-0.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f149826d742b406579466283769a8ea448eed82a789af0ed17b0cd5770433444"}, + {file = "rpds_py-0.27.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80c60cfb5310677bd67cb1e85a1e8eb52e12529545441b43e6f14d90b878775a"}, + {file = "rpds_py-0.27.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7ee6521b9baf06085f62ba9c7a3e5becffbc32480d2f1b351559c001c38ce4c1"}, + {file = "rpds_py-0.27.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a512c8263249a9d68cac08b05dd59d2b3f2061d99b322813cbcc14c3c7421998"}, + {file = "rpds_py-0.27.1-cp312-cp312-win32.whl", hash = "sha256:819064fa048ba01b6dadc5116f3ac48610435ac9a0058bbde98e569f9e785c39"}, + {file = "rpds_py-0.27.1-cp312-cp312-win_amd64.whl", hash = "sha256:d9199717881f13c32c4046a15f024971a3b78ad4ea029e8da6b86e5aa9cf4594"}, + {file = "rpds_py-0.27.1-cp312-cp312-win_arm64.whl", hash = "sha256:33aa65b97826a0e885ef6e278fbd934e98cdcfed80b63946025f01e2f5b29502"}, + {file = "rpds_py-0.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e4b9fcfbc021633863a37e92571d6f91851fa656f0180246e84cbd8b3f6b329b"}, + {file = "rpds_py-0.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1441811a96eadca93c517d08df75de45e5ffe68aa3089924f963c782c4b898cf"}, + {file = "rpds_py-0.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55266dafa22e672f5a4f65019015f90336ed31c6383bd53f5e7826d21a0e0b83"}, + {file = "rpds_py-0.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78827d7ac08627ea2c8e02c9e5b41180ea5ea1f747e9db0915e3adf36b62dcf"}, + {file = "rpds_py-0.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae92443798a40a92dc5f0b01d8a7c93adde0c4dc965310a29ae7c64d72b9fad2"}, + {file = "rpds_py-0.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c46c9dd2403b66a2a3b9720ec4b74d4ab49d4fabf9f03dfdce2d42af913fe8d0"}, + {file = "rpds_py-0.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2efe4eb1d01b7f5f1939f4ef30ecea6c6b3521eec451fb93191bf84b2a522418"}, + {file = "rpds_py-0.27.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:15d3b4d83582d10c601f481eca29c3f138d44c92187d197aff663a269197c02d"}, + {file = "rpds_py-0.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4ed2e16abbc982a169d30d1a420274a709949e2cbdef119fe2ec9d870b42f274"}, + {file = "rpds_py-0.27.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a75f305c9b013289121ec0f1181931975df78738cdf650093e6b86d74aa7d8dd"}, + {file = "rpds_py-0.27.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:67ce7620704745881a3d4b0ada80ab4d99df390838839921f99e63c474f82cf2"}, + {file = "rpds_py-0.27.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d992ac10eb86d9b6f369647b6a3f412fc0075cfd5d799530e84d335e440a002"}, + {file = "rpds_py-0.27.1-cp313-cp313-win32.whl", hash = "sha256:4f75e4bd8ab8db624e02c8e2fc4063021b58becdbe6df793a8111d9343aec1e3"}, + {file = "rpds_py-0.27.1-cp313-cp313-win_amd64.whl", hash = "sha256:f9025faafc62ed0b75a53e541895ca272815bec18abe2249ff6501c8f2e12b83"}, + {file = "rpds_py-0.27.1-cp313-cp313-win_arm64.whl", hash = "sha256:ed10dc32829e7d222b7d3b93136d25a406ba9788f6a7ebf6809092da1f4d279d"}, + {file = "rpds_py-0.27.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:92022bbbad0d4426e616815b16bc4127f83c9a74940e1ccf3cfe0b387aba0228"}, + {file = "rpds_py-0.27.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:47162fdab9407ec3f160805ac3e154df042e577dd53341745fc7fb3f625e6d92"}, + {file = "rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb89bec23fddc489e5d78b550a7b773557c9ab58b7946154a10a6f7a214a48b2"}, + {file = "rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e48af21883ded2b3e9eb48cb7880ad8598b31ab752ff3be6457001d78f416723"}, + {file = "rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f5b7bd8e219ed50299e58551a410b64daafb5017d54bbe822e003856f06a802"}, + {file = "rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08f1e20bccf73b08d12d804d6e1c22ca5530e71659e6673bce31a6bb71c1e73f"}, + {file = "rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dc5dceeaefcc96dc192e3a80bbe1d6c410c469e97bdd47494a7d930987f18b2"}, + {file = "rpds_py-0.27.1-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:d76f9cc8665acdc0c9177043746775aa7babbf479b5520b78ae4002d889f5c21"}, + {file = "rpds_py-0.27.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:134fae0e36022edad8290a6661edf40c023562964efea0cc0ec7f5d392d2aaef"}, + {file = "rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb11a4f1b2b63337cfd3b4d110af778a59aae51c81d195768e353d8b52f88081"}, + {file = "rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:13e608ac9f50a0ed4faec0e90ece76ae33b34c0e8656e3dceb9a7db994c692cd"}, + {file = "rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dd2135527aa40f061350c3f8f89da2644de26cd73e4de458e79606384f4f68e7"}, + {file = "rpds_py-0.27.1-cp313-cp313t-win32.whl", hash = "sha256:3020724ade63fe320a972e2ffd93b5623227e684315adce194941167fee02688"}, + {file = "rpds_py-0.27.1-cp313-cp313t-win_amd64.whl", hash = "sha256:8ee50c3e41739886606388ba3ab3ee2aae9f35fb23f833091833255a31740797"}, + {file = "rpds_py-0.27.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:acb9aafccaae278f449d9c713b64a9e68662e7799dbd5859e2c6b3c67b56d334"}, + {file = "rpds_py-0.27.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b7fb801aa7f845ddf601c49630deeeccde7ce10065561d92729bfe81bd21fb33"}, + {file = "rpds_py-0.27.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe0dd05afb46597b9a2e11c351e5e4283c741237e7f617ffb3252780cca9336a"}, + {file = "rpds_py-0.27.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b6dfb0e058adb12d8b1d1b25f686e94ffa65d9995a5157afe99743bf7369d62b"}, + {file = "rpds_py-0.27.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed090ccd235f6fa8bb5861684567f0a83e04f52dfc2e5c05f2e4b1309fcf85e7"}, + {file = "rpds_py-0.27.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf876e79763eecf3e7356f157540d6a093cef395b65514f17a356f62af6cc136"}, + {file = "rpds_py-0.27.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ed005216a51b1d6e2b02a7bd31885fe317e45897de81d86dcce7d74618ffff"}, + {file = "rpds_py-0.27.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:ee4308f409a40e50593c7e3bb8cbe0b4d4c66d1674a316324f0c2f5383b486f9"}, + {file = "rpds_py-0.27.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b08d152555acf1f455154d498ca855618c1378ec810646fcd7c76416ac6dc60"}, + {file = "rpds_py-0.27.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:dce51c828941973a5684d458214d3a36fcd28da3e1875d659388f4f9f12cc33e"}, + {file = "rpds_py-0.27.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c1476d6f29eb81aa4151c9a31219b03f1f798dc43d8af1250a870735516a1212"}, + {file = "rpds_py-0.27.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3ce0cac322b0d69b63c9cdb895ee1b65805ec9ffad37639f291dd79467bee675"}, + {file = "rpds_py-0.27.1-cp314-cp314-win32.whl", hash = "sha256:dfbfac137d2a3d0725758cd141f878bf4329ba25e34979797c89474a89a8a3a3"}, + {file = "rpds_py-0.27.1-cp314-cp314-win_amd64.whl", hash = "sha256:a6e57b0abfe7cc513450fcf529eb486b6e4d3f8aee83e92eb5f1ef848218d456"}, + {file = "rpds_py-0.27.1-cp314-cp314-win_arm64.whl", hash = "sha256:faf8d146f3d476abfee026c4ae3bdd9ca14236ae4e4c310cbd1cf75ba33d24a3"}, + {file = "rpds_py-0.27.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:ba81d2b56b6d4911ce735aad0a1d4495e808b8ee4dc58715998741a26874e7c2"}, + {file = "rpds_py-0.27.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:84f7d509870098de0e864cad0102711c1e24e9b1a50ee713b65928adb22269e4"}, + {file = "rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9e960fc78fecd1100539f14132425e1d5fe44ecb9239f8f27f079962021523e"}, + {file = "rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62f85b665cedab1a503747617393573995dac4600ff51869d69ad2f39eb5e817"}, + {file = "rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fed467af29776f6556250c9ed85ea5a4dd121ab56a5f8b206e3e7a4c551e48ec"}, + {file = "rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2729615f9d430af0ae6b36cf042cb55c0936408d543fb691e1a9e36648fd35a"}, + {file = "rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b207d881a9aef7ba753d69c123a35d96ca7cb808056998f6b9e8747321f03b8"}, + {file = "rpds_py-0.27.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:639fd5efec029f99b79ae47e5d7e00ad8a773da899b6309f6786ecaf22948c48"}, + {file = "rpds_py-0.27.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fecc80cb2a90e28af8a9b366edacf33d7a91cbfe4c2c4544ea1246e949cfebeb"}, + {file = "rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42a89282d711711d0a62d6f57d81aa43a1368686c45bc1c46b7f079d55692734"}, + {file = "rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:cf9931f14223de59551ab9d38ed18d92f14f055a5f78c1d8ad6493f735021bbb"}, + {file = "rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f39f58a27cc6e59f432b568ed8429c7e1641324fbe38131de852cd77b2d534b0"}, + {file = "rpds_py-0.27.1-cp314-cp314t-win32.whl", hash = "sha256:d5fa0ee122dc09e23607a28e6d7b150da16c662e66409bbe85230e4c85bb528a"}, + {file = "rpds_py-0.27.1-cp314-cp314t-win_amd64.whl", hash = "sha256:6567d2bb951e21232c2f660c24cf3470bb96de56cdcb3f071a83feeaff8a2772"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cdfe4bb2f9fe7458b7453ad3c33e726d6d1c7c0a72960bcc23800d77384e42df"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:8fabb8fd848a5f75a2324e4a84501ee3a5e3c78d8603f83475441866e60b94a3"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eda8719d598f2f7f3e0f885cba8646644b55a187762bec091fa14a2b819746a9"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c64d07e95606ec402a0a1c511fe003873fa6af630bda59bac77fac8b4318ebc"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93a2ed40de81bcff59aabebb626562d48332f3d028ca2036f1d23cbb52750be4"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:387ce8c44ae94e0ec50532d9cb0edce17311024c9794eb196b90e1058aadeb66"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaf94f812c95b5e60ebaf8bfb1898a7d7cb9c1af5744d4a67fa47796e0465d4e"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:4848ca84d6ded9b58e474dfdbad4b8bfb450344c0551ddc8d958bf4b36aa837c"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2bde09cbcf2248b73c7c323be49b280180ff39fadcfe04e7b6f54a678d02a7cf"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:94c44ee01fd21c9058f124d2d4f0c9dc7634bec93cd4b38eefc385dabe71acbf"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:df8b74962e35c9249425d90144e721eed198e6555a0e22a563d29fe4486b51f6"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:dc23e6820e3b40847e2f4a7726462ba0cf53089512abe9ee16318c366494c17a"}, + {file = "rpds_py-0.27.1.tar.gz", hash = "sha256:26a1c73171d10b7acccbded82bf6a586ab8203601e565badc74bbbf8bc5a10f8"}, ] [[package]] name = "ruff" -version = "0.12.4" +version = "0.12.12" requires_python = ">=3.7" summary = "An extremely fast Python linter and code formatter, written in Rust." groups = ["dev"] files = [ - {file = "ruff-0.12.4-py3-none-linux_armv6l.whl", hash = "sha256:cb0d261dac457ab939aeb247e804125a5d521b21adf27e721895b0d3f83a0d0a"}, - {file = "ruff-0.12.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:55c0f4ca9769408d9b9bac530c30d3e66490bd2beb2d3dae3e4128a1f05c7442"}, - {file = "ruff-0.12.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a8224cc3722c9ad9044da7f89c4c1ec452aef2cfe3904365025dd2f51daeae0e"}, - {file = "ruff-0.12.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9949d01d64fa3672449a51ddb5d7548b33e130240ad418884ee6efa7a229586"}, - {file = "ruff-0.12.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:be0593c69df9ad1465e8a2d10e3defd111fdb62dcd5be23ae2c06da77e8fcffb"}, - {file = "ruff-0.12.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7dea966bcb55d4ecc4cc3270bccb6f87a337326c9dcd3c07d5b97000dbff41c"}, - {file = "ruff-0.12.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:afcfa3ab5ab5dd0e1c39bf286d829e042a15e966b3726eea79528e2e24d8371a"}, - {file = "ruff-0.12.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c057ce464b1413c926cdb203a0f858cd52f3e73dcb3270a3318d1630f6395bb3"}, - {file = "ruff-0.12.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e64b90d1122dc2713330350626b10d60818930819623abbb56535c6466cce045"}, - {file = "ruff-0.12.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2abc48f3d9667fdc74022380b5c745873499ff827393a636f7a59da1515e7c57"}, - {file = "ruff-0.12.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2b2449dc0c138d877d629bea151bee8c0ae3b8e9c43f5fcaafcd0c0d0726b184"}, - {file = "ruff-0.12.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:56e45bb11f625db55f9b70477062e6a1a04d53628eda7784dce6e0f55fd549eb"}, - {file = "ruff-0.12.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:478fccdb82ca148a98a9ff43658944f7ab5ec41c3c49d77cd99d44da019371a1"}, - {file = "ruff-0.12.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0fc426bec2e4e5f4c4f182b9d2ce6a75c85ba9bcdbe5c6f2a74fcb8df437df4b"}, - {file = "ruff-0.12.4-py3-none-win32.whl", hash = "sha256:4de27977827893cdfb1211d42d84bc180fceb7b72471104671c59be37041cf93"}, - {file = "ruff-0.12.4-py3-none-win_amd64.whl", hash = "sha256:fe0b9e9eb23736b453143d72d2ceca5db323963330d5b7859d60d101147d461a"}, - {file = "ruff-0.12.4-py3-none-win_arm64.whl", hash = "sha256:0618ec4442a83ab545e5b71202a5c0ed7791e8471435b94e655b570a5031a98e"}, - {file = "ruff-0.12.4.tar.gz", hash = "sha256:13efa16df6c6eeb7d0f091abae50f58e9522f3843edb40d56ad52a5a4a4b6873"}, + {file = "ruff-0.12.12-py3-none-linux_armv6l.whl", hash = "sha256:de1c4b916d98ab289818e55ce481e2cacfaad7710b01d1f990c497edf217dafc"}, + {file = "ruff-0.12.12-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:7acd6045e87fac75a0b0cdedacf9ab3e1ad9d929d149785903cff9bb69ad9727"}, + {file = "ruff-0.12.12-py3-none-macosx_11_0_arm64.whl", hash = "sha256:abf4073688d7d6da16611f2f126be86523a8ec4343d15d276c614bda8ec44edb"}, + {file = "ruff-0.12.12-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:968e77094b1d7a576992ac078557d1439df678a34c6fe02fd979f973af167577"}, + {file = "ruff-0.12.12-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42a67d16e5b1ffc6d21c5f67851e0e769517fb57a8ebad1d0781b30888aa704e"}, + {file = "ruff-0.12.12-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b216ec0a0674e4b1214dcc998a5088e54eaf39417327b19ffefba1c4a1e4971e"}, + {file = "ruff-0.12.12-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:59f909c0fdd8f1dcdbfed0b9569b8bf428cf144bec87d9de298dcd4723f5bee8"}, + {file = "ruff-0.12.12-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ac93d87047e765336f0c18eacad51dad0c1c33c9df7484c40f98e1d773876f5"}, + {file = "ruff-0.12.12-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:01543c137fd3650d322922e8b14cc133b8ea734617c4891c5a9fccf4bfc9aa92"}, + {file = "ruff-0.12.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afc2fa864197634e549d87fb1e7b6feb01df0a80fd510d6489e1ce8c0b1cc45"}, + {file = "ruff-0.12.12-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:0c0945246f5ad776cb8925e36af2438e66188d2b57d9cf2eed2c382c58b371e5"}, + {file = "ruff-0.12.12-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a0fbafe8c58e37aae28b84a80ba1817f2ea552e9450156018a478bf1fa80f4e4"}, + {file = "ruff-0.12.12-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b9c456fb2fc8e1282affa932c9e40f5ec31ec9cbb66751a316bd131273b57c23"}, + {file = "ruff-0.12.12-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5f12856123b0ad0147d90b3961f5c90e7427f9acd4b40050705499c98983f489"}, + {file = "ruff-0.12.12-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:26a1b5a2bf7dd2c47e3b46d077cd9c0fc3b93e6c6cc9ed750bd312ae9dc302ee"}, + {file = "ruff-0.12.12-py3-none-win32.whl", hash = "sha256:173be2bfc142af07a01e3a759aba6f7791aa47acf3604f610b1c36db888df7b1"}, + {file = "ruff-0.12.12-py3-none-win_amd64.whl", hash = "sha256:e99620bf01884e5f38611934c09dd194eb665b0109104acae3ba6102b600fd0d"}, + {file = "ruff-0.12.12-py3-none-win_arm64.whl", hash = "sha256:2a8199cab4ce4d72d158319b63370abf60991495fb733db96cd923a34c52d093"}, + {file = "ruff-0.12.12.tar.gz", hash = "sha256:b86cd3415dbe31b3b46a71c598f4c4b2f550346d1ccf6326b347cc0c8fd063d6"}, ] [[package]] @@ -1146,13 +1201,13 @@ files = [ [[package]] name = "soupsieve" -version = "2.7" -requires_python = ">=3.8" +version = "2.8" +requires_python = ">=3.9" summary = "A modern CSS selector implementation for Beautiful Soup." groups = ["dev"] files = [ - {file = "soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4"}, - {file = "soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a"}, + {file = "soupsieve-2.8-py3-none-any.whl", hash = "sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c"}, + {file = "soupsieve-2.8.tar.gz", hash = "sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f"}, ] [[package]] @@ -1405,13 +1460,13 @@ files = [ [[package]] name = "typing-extensions" -version = "4.14.1" +version = "4.15.0" requires_python = ">=3.9" summary = "Backported and Experimental Type Hints for Python 3.9+" groups = ["default", "dev"] files = [ - {file = "typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76"}, - {file = "typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36"}, + {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, + {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, ] [[package]] @@ -1441,7 +1496,7 @@ files = [ [[package]] name = "wasmtime" -version = "34.0.0" +version = "36.0.0" requires_python = ">=3.9" summary = "A WebAssembly runtime powered by Wasmtime" groups = ["default"] @@ -1449,17 +1504,17 @@ dependencies = [ "importlib-resources>=5.10", ] files = [ - {file = "wasmtime-34.0.0-py3-none-android_26_arm64_v8a.whl", hash = "sha256:d092db8a322a5e59579b4e52f9cf6f0960f71da9c08eeaad6dfb9489542f539b"}, - {file = "wasmtime-34.0.0-py3-none-android_26_x86_64.whl", hash = "sha256:6b3bcf9621e840bff6f926d424e6f4c864133e0c3d6254adb963dc2f418cedd8"}, - {file = "wasmtime-34.0.0-py3-none-any.whl", hash = "sha256:ad7aa9965ff597ee821e57c15f83a2306626237e6394410ada544afc014522fa"}, - {file = "wasmtime-34.0.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:ba7dbcc8633ee6edaa93d8be7e45c613ae55fa020a9dfa032f97dca5f92ea6cf"}, - {file = "wasmtime-34.0.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:31fc042c5acfa1b93a12292f508d9bcfed2caed118b20053d573afaffdd4eda8"}, - {file = "wasmtime-34.0.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:735a30599f98d92d9d631615651ef4b964f3e32f5f0ab80e4e68c00633789726"}, - {file = "wasmtime-34.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:39363cebe275fc65c94fff557ca4d1e4f3e2af7a3c309abf506a0bdb2c0dd770"}, - {file = "wasmtime-34.0.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:62e1b8854ede084aaa1bab2b0b6914c9a2c935072146431f48e9319a8818c666"}, - {file = "wasmtime-34.0.0-py3-none-win_amd64.whl", hash = "sha256:f8cac47169262e7b0e322c457b9aa82fd1ed274d95542ade68248aeee0c7f7de"}, - {file = "wasmtime-34.0.0-py3-none-win_arm64.whl", hash = "sha256:4679f52298b206cf8f5d544ca0ec19800df04d606f8e0517b63b0c5d62bda85d"}, - {file = "wasmtime-34.0.0.tar.gz", hash = "sha256:c8cdf5ca3a186a1687f32828ae24e21a6b316629d41bf85be65edb53dd56913c"}, + {file = "wasmtime-36.0.0-py3-none-android_26_arm64_v8a.whl", hash = "sha256:eab97e2a54fcfd074dcbddf38d7397a0411914802e072f4fd30ed41c2a5604fe"}, + {file = "wasmtime-36.0.0-py3-none-android_26_x86_64.whl", hash = "sha256:72c2186c11b255ea8c6874320973712eceb384f5d68594de4348e2a169437af0"}, + {file = "wasmtime-36.0.0-py3-none-any.whl", hash = "sha256:d1e41c3f832752982aced040168b4cea1144c39a5ed43882791b2e2975145ee3"}, + {file = "wasmtime-36.0.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:a8ff3bf20f84f3f092ef7bf216afa2706e496ef3e190fb90b88b13b9529ed035"}, + {file = "wasmtime-36.0.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6396ca0178ceffb17464e3cf2b4beae0e0b1da5c95aa5d27ff094f2a7f41106e"}, + {file = "wasmtime-36.0.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:bca67a384a64a5d9164ebc48c106862881a6d2af67d0740ed29cc50847cbe6f5"}, + {file = "wasmtime-36.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:cd6f69bb744096b9bcca17863c463a96d08af86db1ccc0d74206a33892fac887"}, + {file = "wasmtime-36.0.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5ea87199a35616848e20060f3cc00c22d4b2a919fd72bdea4c62b6503ac2bccc"}, + {file = "wasmtime-36.0.0-py3-none-win_amd64.whl", hash = "sha256:1e826960c02cbcf74cb91de41b63ff55ad6c9260e684fd4c315736b607642934"}, + {file = "wasmtime-36.0.0-py3-none-win_arm64.whl", hash = "sha256:de932f23d257917652358093226315aeed21a262fdc124fff3486d5dfa62b40b"}, + {file = "wasmtime-36.0.0.tar.gz", hash = "sha256:e0523be4b2ebb1344a387fb4ce054a62acbcbc19671a7e7eeb166355d2f3004c"}, ] [[package]] @@ -1476,22 +1531,22 @@ files = [ [[package]] name = "yowasp-runtime" -version = "1.77" +version = "1.79" requires_python = "~=3.8" summary = "Common runtime for YoWASP packages" groups = ["default"] dependencies = [ "importlib-resources; python_version < \"3.9\"", "platformdirs<5,>=3.0", - "wasmtime<35,>=21.0.0", + "wasmtime<37,>=21.0.0", ] files = [ - {file = "yowasp_runtime-1.77-py3-none-any.whl", hash = "sha256:7ad7493baa68a8b4a7c3927f0805f783d38afd6d4220e7bdb254575fc0bf28c1"}, + {file = "yowasp_runtime-1.79-py3-none-any.whl", hash = "sha256:029ca4c5b4c061304acbeefe6d383526415b7c36569425f98e0032e314215fc5"}, ] [[package]] name = "yowasp-yosys" -version = "0.55.0.3.post946.dev0" +version = "0.57.0.0.post986" requires_python = "~=3.9" summary = "Yosys Open SYnthesis Suite" groups = ["default"] @@ -1500,7 +1555,7 @@ dependencies = [ "yowasp-runtime~=1.12", ] files = [ - {file = "yowasp_yosys-0.55.0.3.post946.dev0-py3-none-any.whl", hash = "sha256:bc8a09dde5f3688e00de0b0b02098a5dfb65fbecc95af71f4a92718a17da08a4"}, + {file = "yowasp_yosys-0.57.0.0.post986-py3-none-any.whl", hash = "sha256:8156c5291db5ac36b4c4482ebc684ac853a5f41c79f12957605560bc769f86fc"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index 1373683e..d2f0c915 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -68,9 +68,9 @@ test-cov-html.cmd = "pytest --cov=chipflow_lib --cov-report=html" test-docs.cmd = "sphinx-build -b doctest docs/ docs/_build" lint.composite = [ "./tools/license_check.sh", "ruff check {args}", "pyright chipflow_lib"] docs.cmd = "sphinx-build docs/ docs/_build/ -W --keep-going" -test-silicon.cmd = "pytest tests/test_silicon_platform.py tests/test_silicon_platform_additional.py tests/test_silicon_platform_amaranth.py tests/test_silicon_platform_build.py tests/test_silicon_platform_port.py --cov=chipflow_lib.platforms.silicon --cov-report=term" _check-project.call = "tools.check_project:main" chipflow.shell = "cd $PDM_RUN_CWD && chipflow" +test-all.composite = [ 'lint', 'test', 'test-docs' ] [dependency-groups] dev = [ diff --git a/tests/test_cli.py b/tests/test_cli.py index d4b8e95a..03c03fb9 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -2,6 +2,9 @@ import pytest import unittest + +from contextlib import redirect_stdout +from io import StringIO from unittest import mock from chipflow_lib import ChipFlowError @@ -64,7 +67,7 @@ def test_run_command_error(self, mock_get_cls, mock_pin_command, mock_parse_conf mock_get_cls.return_value = lambda config: mock_test_cmd # Capture stdout for assertion - with mock.patch("builtins.print") as mock_print: + with redirect_stdout(StringIO()) as buffer: with pytest.raises(SystemExit) as systemexit: # Run with error action run(["test", "error"]) @@ -72,9 +75,7 @@ def test_run_command_error(self, mock_get_cls, mock_pin_command, mock_parse_conf assert systemexit.type is SystemExit assert systemexit.value.code == 1 - # Error message should be printed - mock_print.assert_called_once() - self.assertIn("Error while executing `test error`", mock_print.call_args[0][0]) + self.assertIn("Error while executing `test error`", buffer.getvalue()) @mock.patch("chipflow_lib.cli._parse_config") @mock.patch("chipflow_lib.cli.PinCommand") @@ -91,7 +92,7 @@ def test_run_unexpected_error(self, mock_get_cls, mock_pin_command, mock_parse_c mock_get_cls.return_value = lambda config: mock_test_cmd # Capture stdout for assertion - with mock.patch("builtins.print") as mock_print: + with redirect_stdout(StringIO()) as buffer: with pytest.raises(SystemExit) as systemexit: # Run with unexpected error action run(["test", "unexpected"]) @@ -100,9 +101,8 @@ def test_run_unexpected_error(self, mock_get_cls, mock_pin_command, mock_parse_c assert systemexit.value.code == 1 # Error message should be printed - mock_print.assert_called_once() - self.assertIn("Error while executing `test unexpected`", mock_print.call_args[0][0]) - self.assertIn("Unexpected error", mock_print.call_args[0][0]) + self.assertIn("Error while executing `test unexpected`", buffer.getvalue()) + self.assertIn("Unexpected error", buffer.getvalue()) @mock.patch("chipflow_lib.cli._parse_config") @mock.patch("chipflow_lib.cli.PinCommand") diff --git a/tests/test_steps_silicon.py b/tests/test_steps_silicon.py index e46f9cd7..d4ef2331 100644 --- a/tests/test_steps_silicon.py +++ b/tests/test_steps_silicon.py @@ -21,8 +21,8 @@ from chipflow_lib.cli import run as cli_run from chipflow_lib.steps.silicon import SiliconStep, SiliconTop -from chipflow_lib.config_models import Config, ChipFlowConfig, SiliconConfig -from chipflow_lib.platforms._internal import Process +from chipflow_lib.config_models import Config, ChipFlowConfig, SiliconConfig, Process + DEFAULT_PINLOCK = { "process" : "ihp_sg13g2", @@ -38,6 +38,7 @@ "metadata" : {}, } + class TestSiliconStep(unittest.TestCase): def writeConfig(self, config, pinlock=DEFAULT_PINLOCK): tmppath = Path(self.temp_dir.name) diff --git a/tests/test_utils_additional.py b/tests/test_utils_additional.py index 5c034927..61fd0d47 100644 --- a/tests/test_utils_additional.py +++ b/tests/test_utils_additional.py @@ -1,7 +1,6 @@ # SPDX-License-Identifier: BSD-2-Clause import unittest -from amaranth import Const from amaranth.lib import io from chipflow_lib.platforms import ( @@ -30,7 +29,7 @@ def test_pin_signature_properties(self): def test_pin_signature_annotations(self): """Test IOSignature annotations method""" # Create signature - sig = IOSignature(direction=io.Direction.Output, width=8, init=Const.cast(42)) + sig = IOSignature(direction=io.Direction.Output, width=8, init=42) # Create a mock object to pass to annotations mock_obj = object() @@ -58,7 +57,7 @@ def test_pin_signature_annotations(self): self.assertEqual(json_data['direction'], 'o') self.assertEqual(json_data['width'], 8) # The init field contains an Amaranth Const object, check its value - self.assertEqual(json_data['init'].value, 42) + self.assertEqual(json_data['init'], 42) class TestIOModel(unittest.TestCase): @@ -89,4 +88,4 @@ def test_package_definitions_exist(self): package_def = PACKAGE_DEFINITIONS[package_name] self.assertIsNotNone(package_def) self.assertTrue(hasattr(package_def, 'name')) - self.assertEqual(package_def.name, package_name) \ No newline at end of file + self.assertEqual(package_def.name, package_name)