From 573a2bd966f63fc5d0f58c838e6a7b480575e53c Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Tue, 21 Apr 2026 00:38:47 -0700 Subject: [PATCH 01/25] Create CompiledDesignExport.py --- edg/core/CompiledDesignExport.py | 46 ++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 edg/core/CompiledDesignExport.py diff --git a/edg/core/CompiledDesignExport.py b/edg/core/CompiledDesignExport.py new file mode 100644 index 000000000..d11ab6b59 --- /dev/null +++ b/edg/core/CompiledDesignExport.py @@ -0,0 +1,46 @@ +from typing import Optional, Dict, List, Any, Union + +from pydantic import RootModel, BaseModel + +"""A compiled design, as a human-readable Pydantic / JSON-able version of the IR data structure.""" + + +class CompiledParam(BaseModel): + path: List[str] + type: str + expr: Optional[str] # expression used in assign, if available + value: Optional[Any] # solved value, if available + + +class CompiledPortArray(BaseModel): + ports: Dict[str, "CompiledPort"] + + +class CompiledPort(BaseModel): + path: List[str] + cls: str # self class + # path of connected port, if connected + # for block ports, this is either the link port or the exported port + # for link ports, this is the block port + connected_path: Optional[List[str]] + params: Dict[str, CompiledParam] + ports: Dict[str, "CompiledPort"] + + +class CompiledLink(BaseModel): + path: List[str] + cls: str # self class + params: Dict[str, CompiledParam] + ports: Dict[str, CompiledPort] + links: Dict[str, "CompiledLink"] + + +class CompiledBlock(BaseModel): + path: List[str] + cls: str # self class + superclasses: List[str] # all superclasses + params: Dict[str, CompiledParam] + ports: Dict[str, Union[CompiledPortArray, CompiledPort]] + blocks: Dict[str, "CompiledBlock"] # sub-blocks + links: Dict[str, CompiledLink] + # TODO: all constraints? From 80ebd46df0d655834e86f9e36e81bf5ae9e83e77 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 25 Apr 2026 10:53:03 -0700 Subject: [PATCH 02/25] Create FnTransformUtil.py --- edg/core/FnTransformUtil.py | 74 +++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 edg/core/FnTransformUtil.py diff --git a/edg/core/FnTransformUtil.py b/edg/core/FnTransformUtil.py new file mode 100644 index 000000000..2ef1cad47 --- /dev/null +++ b/edg/core/FnTransformUtil.py @@ -0,0 +1,74 @@ +from typing import TypeVar, Generic, Mapping, Union + +from .. import edgir +from .TransformUtil import TransformContext, Path + +# these type vars define the post-transform-result of blocks, ports, or links +# these can be set to None if unused +TransformedBlock = TypeVar("TransformedBlock", default=None) +TransformedPort = TypeVar("TransformedPort", default=None) +TransformedLink = TypeVar("TransformedLink", default=None) + + +class FnTransformBase(Generic[TransformedBlock, TransformedPort, TransformedLink]): + """A design tree walking / transform base class that provides the traversal structure. + Supports both pre-order processing (through the `visit_*` methods) and post-order processing + (through the `transform_*` methods, which are given the post-order results of their elements). + """ + + def transform(self, design: edgir.Design) -> TransformedBlock: + """Entry point for the transform. Transforms the design and returns the result.""" + context = TransformContext(Path.empty(), design) + return self.visit_block(context, design.contents) + + def _visit_blocklike(self, context: TransformContext, elt: edgir.BlockLike) -> TransformedBlock: + pass + + def _visit_portlike(self, context: TransformContext, elt: edgir.PortLike) -> TransformedBlock: + pass + + def _visit_linklike(self, context: TransformContext, elt: edgir.LinkLike) -> TransformedBlock: + pass + + def visit_block(self, context: TransformContext, block: edgir.HierarchyBlock) -> TransformedBlock: + """Called during root-down traversal of the design. Returns the transformed results. + This call "lasts" for the duration of traversal of the block and all its contained elements. + Optionally add pre-hooks for pre-order processing.""" + pass + + def visit_port(self, context: TransformContext, port: Union[edgir.Port, edgir.PortArray]) -> TransformedPort: + """visit_block, but for ports.""" + pass + + def visit_link(self, context: TransformContext, link: edgir.Link) -> TransformedLink: + """visit_block, but for links.""" + pass + + def transform_block( + self, + context: TransformContext, + elt: edgir.HierarchyBlock, + blocks: Mapping[str, TransformedBlock], + ports: Mapping[str, TransformedPort], + links: Mapping[str, TransformedLink], + ) -> TransformedBlock: + """Called after all of a block's contained elements have been transformed, and is given the results of those + transforms. Returns the transformed result of the block itself.""" + raise NotImplementedError + + def transform_port( + self, + elt: Union[edgir.Port, edgir.PortArray], + ports: Mapping[str, TransformedPort], + ) -> TransformedPort: + """Post-order processing of a port. By default, returns the port unchanged.""" + raise NotImplementedError + + def transform_link( + self, + elt: edgir.Link, + ports: Mapping[str, TransformedPort], + links: Mapping[str, TransformedLink], + ) -> TransformedLink: + """Post-order processing of a link. By default, returns the link unchanged.""" + raise NotImplementedError From b9805c780b58ac2ab6ed88884aa531a0cb35dc60 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 25 Apr 2026 11:10:08 -0700 Subject: [PATCH 03/25] Update FnTransformUtil.py --- edg/core/FnTransformUtil.py | 90 ++++++++++++++++++++++++++----------- 1 file changed, 65 insertions(+), 25 deletions(-) diff --git a/edg/core/FnTransformUtil.py b/edg/core/FnTransformUtil.py index 2ef1cad47..e6b17d2fe 100644 --- a/edg/core/FnTransformUtil.py +++ b/edg/core/FnTransformUtil.py @@ -1,16 +1,16 @@ -from typing import TypeVar, Generic, Mapping, Union +from typing import TypeVar, Generic, Mapping, Union, Dict from .. import edgir from .TransformUtil import TransformContext, Path # these type vars define the post-transform-result of blocks, ports, or links # these can be set to None if unused -TransformedBlock = TypeVar("TransformedBlock", default=None) TransformedPort = TypeVar("TransformedPort", default=None) +TransformedBlock = TypeVar("TransformedBlock", default=None) TransformedLink = TypeVar("TransformedLink", default=None) -class FnTransformBase(Generic[TransformedBlock, TransformedPort, TransformedLink]): +class FnTransformBase(Generic[TransformedPort, TransformedBlock, TransformedLink]): """A design tree walking / transform base class that provides the traversal structure. Supports both pre-order processing (through the `visit_*` methods) and post-order processing (through the `transform_*` methods, which are given the post-order results of their elements). @@ -21,54 +21,94 @@ def transform(self, design: edgir.Design) -> TransformedBlock: context = TransformContext(Path.empty(), design) return self.visit_block(context, design.contents) - def _visit_blocklike(self, context: TransformContext, elt: edgir.BlockLike) -> TransformedBlock: + def _visit_portlike(self, context: TransformContext, elt: edgir.PortLike) -> TransformedPort: pass - def _visit_portlike(self, context: TransformContext, elt: edgir.PortLike) -> TransformedBlock: + def _visit_blocklike(self, context: TransformContext, elt: edgir.BlockLike) -> TransformedBlock: pass - def _visit_linklike(self, context: TransformContext, elt: edgir.LinkLike) -> TransformedBlock: + def _visit_linklike(self, context: TransformContext, elt: edgir.LinkLike) -> TransformedLink: pass - def visit_block(self, context: TransformContext, block: edgir.HierarchyBlock) -> TransformedBlock: + def visit_port(self, context: TransformContext, elt: Union[edgir.Port, edgir.PortArray]) -> TransformedPort: + """visit_block, but for ports.""" + transformed_ports: Dict[str, TransformedPort] = {} + if isinstance(elt, edgir.Port): + for port_pair in elt.ports: + transformed_ports[port_pair.name] = self._visit_portlike( + context.append_port(port_pair.name), port_pair.value + ) + elif isinstance(elt, edgir.PortArray): + for port_pair in elt.ports.ports: + transformed_ports[port_pair.name] = self._visit_portlike( + context.append_port(port_pair.name), port_pair.value + ) + else: + raise TypeError(f"unknown elt type {type(elt)}") + return self.transform_port(context, elt, transformed_ports) + + def visit_block(self, context: TransformContext, elt: edgir.HierarchyBlock) -> TransformedBlock: """Called during root-down traversal of the design. Returns the transformed results. This call "lasts" for the duration of traversal of the block and all its contained elements. Optionally add pre-hooks for pre-order processing.""" - pass + transformed_ports: Dict[str, TransformedPort] = {} + for port_pair in elt.ports: + transformed_ports[port_pair.name] = self._visit_portlike( + context.append_port(port_pair.name), port_pair.value + ) + transformed_blocks: Dict[str, TransformedBlock] = {} + for block_pair in elt.blocks: + transformed_blocks[block_pair.name] = self._visit_blocklike( + context.append_block(block_pair.name), block_pair.value + ) + transformed_links: Dict[str, TransformedLink] = {} + for link_pair in elt.links: + transformed_links[link_pair.name] = self._visit_linklike( + context.append_link(link_pair.name), link_pair.value + ) + return self.transform_block(context, elt, transformed_ports, transformed_blocks, transformed_links) - def visit_port(self, context: TransformContext, port: Union[edgir.Port, edgir.PortArray]) -> TransformedPort: - """visit_block, but for ports.""" - pass - - def visit_link(self, context: TransformContext, link: edgir.Link) -> TransformedLink: + def visit_link(self, context: TransformContext, elt: edgir.Link) -> TransformedLink: """visit_block, but for links.""" - pass + transformed_ports: Dict[str, TransformedPort] = {} + for port_pair in elt.ports: + transformed_ports[port_pair.name] = self._visit_portlike( + context.append_port(port_pair.name), port_pair.value + ) + transformed_links: Dict[str, TransformedLink] = {} + for link_pair in elt.links: + transformed_links[link_pair.name] = self._visit_linklike( + context.append_link(link_pair.name), link_pair.value + ) + return self.transform_link(context, elt, transformed_ports, transformed_links) + + def transform_port( + self, + context: TransformContext, + elt: Union[edgir.Port, edgir.PortArray], + ports: Mapping[str, TransformedPort], + ) -> TransformedPort: + """Post-order processing of a port. By default, returns the port unchanged.""" + return None # type: ignore def transform_block( self, context: TransformContext, elt: edgir.HierarchyBlock, - blocks: Mapping[str, TransformedBlock], ports: Mapping[str, TransformedPort], + blocks: Mapping[str, TransformedBlock], links: Mapping[str, TransformedLink], ) -> TransformedBlock: """Called after all of a block's contained elements have been transformed, and is given the results of those transforms. Returns the transformed result of the block itself.""" - raise NotImplementedError - - def transform_port( - self, - elt: Union[edgir.Port, edgir.PortArray], - ports: Mapping[str, TransformedPort], - ) -> TransformedPort: - """Post-order processing of a port. By default, returns the port unchanged.""" - raise NotImplementedError + return None # type: ignore def transform_link( self, + context: TransformContext, elt: edgir.Link, ports: Mapping[str, TransformedPort], links: Mapping[str, TransformedLink], ) -> TransformedLink: """Post-order processing of a link. By default, returns the link unchanged.""" - raise NotImplementedError + return None # type: ignore From 0cc9c23e8ffea2119312549b9417d18b89350967 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 25 Apr 2026 11:44:22 -0700 Subject: [PATCH 04/25] Update FnTransformUtil.py --- edg/core/FnTransformUtil.py | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/edg/core/FnTransformUtil.py b/edg/core/FnTransformUtil.py index e6b17d2fe..4ccb5c141 100644 --- a/edg/core/FnTransformUtil.py +++ b/edg/core/FnTransformUtil.py @@ -22,13 +22,30 @@ def transform(self, design: edgir.Design) -> TransformedBlock: return self.visit_block(context, design.contents) def _visit_portlike(self, context: TransformContext, elt: edgir.PortLike) -> TransformedPort: - pass + if elt.HasField("port"): + return self.visit_port(context, elt.port) + elif elt.HasField("array"): + return self.visit_port(context, elt.array) + elif elt.HasField("lib_elem"): + raise ValueError(f"unresolved PortLike lib at {context}") + else: + raise ValueError(f"unknown PortLike type {type(elt)} at {context}") def _visit_blocklike(self, context: TransformContext, elt: edgir.BlockLike) -> TransformedBlock: - pass + if elt.HasField("hierarchy"): + return self.visit_block(context, elt.hierarchy) + elif elt.HasField("lib_elem"): + raise ValueError(f"unresolved BlockLike lib at {context}") + else: + raise ValueError(f"unknown BlockLike type {type(elt)} at {context}") def _visit_linklike(self, context: TransformContext, elt: edgir.LinkLike) -> TransformedLink: - pass + if elt.HasField("link"): + return self.visit_link(context, elt.link) + elif elt.HasField("lib_elem"): + raise ValueError(f"unresolved LinkLike lib at {context}") + else: + raise ValueError(f"unknown LinkLike type {type(elt)} at {context}") def visit_port(self, context: TransformContext, elt: Union[edgir.Port, edgir.PortArray]) -> TransformedPort: """visit_block, but for ports.""" @@ -44,7 +61,7 @@ def visit_port(self, context: TransformContext, elt: Union[edgir.Port, edgir.Por context.append_port(port_pair.name), port_pair.value ) else: - raise TypeError(f"unknown elt type {type(elt)}") + raise TypeError(f"unknown Port type {type(elt)} at {context}") return self.transform_port(context, elt, transformed_ports) def visit_block(self, context: TransformContext, elt: edgir.HierarchyBlock) -> TransformedBlock: From 6245695b966e7397034dccb013bfdbec78191ed1 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 25 Apr 2026 11:53:15 -0700 Subject: [PATCH 05/25] wip --- edg/core/CompiledDesignExport.py | 47 ++++++++++++++++++++++++++++++-- edg/core/FnTransformUtil.py | 4 +-- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/edg/core/CompiledDesignExport.py b/edg/core/CompiledDesignExport.py index d11ab6b59..3e8dae35b 100644 --- a/edg/core/CompiledDesignExport.py +++ b/edg/core/CompiledDesignExport.py @@ -1,6 +1,10 @@ -from typing import Optional, Dict, List, Any, Union +from typing import Optional, Dict, List, Any, Union, Mapping -from pydantic import RootModel, BaseModel +from pydantic import BaseModel + +from edg import edgir +from edg.core.FnTransformUtil import FnTransformBase, TransformedPort, TransformedBlock, TransformedLink +from edg.core.TransformUtil import TransformContext, Path """A compiled design, as a human-readable Pydantic / JSON-able version of the IR data structure.""" @@ -44,3 +48,42 @@ class CompiledBlock(BaseModel): blocks: Dict[str, "CompiledBlock"] # sub-blocks links: Dict[str, CompiledLink] # TODO: all constraints? + + +class CompiledDesignExportTransform(FnTransformBase[CompiledPort, CompiledBlock, CompiledLink]): + """Transform a design into the CompiledBlock and friend data structure for export to a human-readable format.""" + + @staticmethod + def _path_to_path(context: Path) -> List[str]: + return list(context.path.to_tuple()) + + @staticmethod + def _libpath_to_str(libpath: edgir.LibraryPath) -> str: + return libpath.target.name + + def transform_block( + self, + context: TransformContext, + elt: edgir.HierarchyBlock, + ports: Mapping[str, CompiledPort], + blocks: Mapping[str, CompiledBlock], + links: Mapping[str, CompiledLink], + ) -> CompiledBlock: + return CompiledBlock( + path=self._path_to_path(context.path), + cls=self._libpath_to_str(elt.self_class), + superclasses=[self._libpath_to_str(cls) for cls in elt.superclasses] + + [self._libpath_to_str(cls) for cls in elt.super_superclasses], + params={ + param_pair.name: CompiledParam( + path=self._path_to_path(context.path.append_param(param_pair.name)), + type=param_pair.value.WhichOneof("value"), + expr=None, # TODO IMPLEMENT ME + value=None, # TODO IMPLEMENT ME + ) + for param_pair in elt.params + }, + ports=dict(ports), + blocks=dict(blocks), + links=dict(links), + ) diff --git a/edg/core/FnTransformUtil.py b/edg/core/FnTransformUtil.py index 4ccb5c141..3d4c04fc5 100644 --- a/edg/core/FnTransformUtil.py +++ b/edg/core/FnTransformUtil.py @@ -105,7 +105,7 @@ def transform_port( elt: Union[edgir.Port, edgir.PortArray], ports: Mapping[str, TransformedPort], ) -> TransformedPort: - """Post-order processing of a port. By default, returns the port unchanged.""" + """transform_block, but for ports.""" return None # type: ignore def transform_block( @@ -127,5 +127,5 @@ def transform_link( ports: Mapping[str, TransformedPort], links: Mapping[str, TransformedLink], ) -> TransformedLink: - """Post-order processing of a link. By default, returns the link unchanged.""" + """transform_block, but for links.""" return None # type: ignore From c2721ffa124120479e0cf77b4bf179d27fbcc9e4 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 25 Apr 2026 12:03:42 -0700 Subject: [PATCH 06/25] end to end concept --- .gitignore | 1 + edg/BoardCompiler.py | 13 ++++++--- edg/core/CompiledDesignExport.py | 45 +++++++++++++++++++++++++++++--- edg/core/__init__.py | 1 + 4 files changed, 53 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 39f531846..cbea7b791 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ __pycache__ examples/*/*.net examples/*/*.edg +examples/*/*.compiled.json examples/*/*.pdf examples/*/gerbers /*.net diff --git a/edg/BoardCompiler.py b/edg/BoardCompiler.py index 835b85c5c..fadc90d4e 100644 --- a/edg/BoardCompiler.py +++ b/edg/BoardCompiler.py @@ -3,7 +3,7 @@ from contextlib import suppress from typing import Type, Optional, Tuple -from .core import Block, ScalaCompiler, CompiledDesign +from .core import Block, ScalaCompiler, CompiledDesign, CompiledDesignExportTransform from .electronics_model.NetlistBackend import NetlistBackend # imported separately b/c mypy confuses with the modules from .electronics_model.SvgPcbBackend import SvgPcbBackend from .electronics_model.RefdesRefinementPass import RefdesRefinementPass @@ -21,6 +21,7 @@ def compile_board(design: Type[Block], target_dir_name: Optional[Tuple[str, str] netlist_filename = os.path.join(target_dir, f"{target_name}.net") bom_filename = os.path.join(target_dir, f"{target_name}.csv") svgpcb_filename = os.path.join(target_dir, f"{target_name}.svgpcb.js") + compiled_json_filename = os.path.join(target_dir, f"{target_name}.compiled.json") with suppress(FileNotFoundError): os.remove(design_filename) @@ -30,6 +31,8 @@ def compile_board(design: Type[Block], target_dir_name: Optional[Tuple[str, str] os.remove(bom_filename) with suppress(FileNotFoundError): os.remove(svgpcb_filename) + with suppress(FileNotFoundError): + os.remove(compiled_json_filename) compiled = ScalaCompiler.compile(design, ignore_errors=True) compiled.append_values(RefdesRefinementPass().run(compiled)) @@ -46,6 +49,7 @@ def compile_board(design: Type[Block], target_dir_name: Optional[Tuple[str, str] netlist_all = NetlistBackend().run(compiled) bom_all = GenerateBom().run(compiled) svgpcb_all = SvgPcbBackend().run(compiled) + compiled_json = CompiledDesignExportTransform().transform(compiled) assert len(netlist_all) == 1 if target_dir_name is not None: @@ -56,8 +60,11 @@ def compile_board(design: Type[Block], target_dir_name: Optional[Tuple[str, str] bom_file.write(bom_all[0][1]) if svgpcb_all: - with open(svgpcb_filename, "w", encoding="utf-8") as bom_file: - bom_file.write(svgpcb_all[0][1]) + with open(svgpcb_filename, "w", encoding="utf-8") as svgpcb_file: + svgpcb_file.write(svgpcb_all[0][1]) + + with open(compiled_json_filename, "w", encoding="utf-8") as compiled_json_file: + compiled_json_file.write(compiled_json.model_dump_json(indent=2)) return compiled diff --git a/edg/core/CompiledDesignExport.py b/edg/core/CompiledDesignExport.py index 3e8dae35b..316ec9cd5 100644 --- a/edg/core/CompiledDesignExport.py +++ b/edg/core/CompiledDesignExport.py @@ -3,7 +3,7 @@ from pydantic import BaseModel from edg import edgir -from edg.core.FnTransformUtil import FnTransformBase, TransformedPort, TransformedBlock, TransformedLink +from edg.core.FnTransformUtil import FnTransformBase from edg.core.TransformUtil import TransformContext, Path """A compiled design, as a human-readable Pydantic / JSON-able version of the IR data structure.""" @@ -54,8 +54,8 @@ class CompiledDesignExportTransform(FnTransformBase[CompiledPort, CompiledBlock, """Transform a design into the CompiledBlock and friend data structure for export to a human-readable format.""" @staticmethod - def _path_to_path(context: Path) -> List[str]: - return list(context.path.to_tuple()) + def _path_to_path(path: Path) -> List[str]: + return list(path.to_tuple()) @staticmethod def _libpath_to_str(libpath: edgir.LibraryPath) -> str: @@ -77,7 +77,7 @@ def transform_block( params={ param_pair.name: CompiledParam( path=self._path_to_path(context.path.append_param(param_pair.name)), - type=param_pair.value.WhichOneof("value"), + type=param_pair.value.WhichOneof("val"), expr=None, # TODO IMPLEMENT ME value=None, # TODO IMPLEMENT ME ) @@ -87,3 +87,40 @@ def transform_block( blocks=dict(blocks), links=dict(links), ) + + def transform_port( + self, + context: TransformContext, + elt: Union[edgir.Port, edgir.PortArray], + ports: Mapping[str, CompiledPort], + ) -> CompiledPort: + return CompiledPort( + path=self._path_to_path(context.path), + cls=self._libpath_to_str(elt.self_class), + connected_path=None, # TODO IMPLEMENT ME + params={}, # TODO IMPLEMENT ME + ports=dict(ports), + ) + + def transform_link( + self, + context: TransformContext, + elt: edgir.Link, + ports: Mapping[str, CompiledPort], + links: Mapping[str, CompiledLink], + ) -> CompiledLink: + return CompiledLink( + path=self._path_to_path(context.path), + cls=self._libpath_to_str(elt.self_class), + params={ + param_pair.name: CompiledParam( + path=self._path_to_path(context.path.append_param(param_pair.name)), + type=param_pair.value.WhichOneof("val"), + expr=None, # TODO IMPLEMENT ME + value=None, # TODO IMPLEMENT ME + ) + for param_pair in elt.params + }, + ports=dict(ports), + links=dict(links), + ) diff --git a/edg/core/__init__.py b/edg/core/__init__.py index 43139a731..8857e8a26 100644 --- a/edg/core/__init__.py +++ b/edg/core/__init__.py @@ -32,3 +32,4 @@ from .BufferSerializer import BufferDeserializer, BufferSerializer from .ScalaCompilerInterface import ScalaCompiler, CompiledDesign, CompilerCheckError from .Refinements import Refinements, ParamValue +from .CompiledDesignExport import CompiledDesignExportTransform From 4e961db408510446f5e6128226bbf022eefe5110 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 25 Apr 2026 12:08:50 -0700 Subject: [PATCH 07/25] Update CompiledDesignExport.py --- edg/core/CompiledDesignExport.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/edg/core/CompiledDesignExport.py b/edg/core/CompiledDesignExport.py index 316ec9cd5..f22d57a31 100644 --- a/edg/core/CompiledDesignExport.py +++ b/edg/core/CompiledDesignExport.py @@ -1,4 +1,4 @@ -from typing import Optional, Dict, List, Any, Union, Mapping +from typing import Optional, Dict, List, Any, Union, Mapping, Literal from pydantic import BaseModel @@ -10,8 +10,11 @@ class CompiledParam(BaseModel): - path: List[str] - type: str + path: str + # TODO support array sub-type + type: Union[ + Literal["floating"], Literal["integer"], Literal["boolean"], Literal["text"], Literal["range"], Literal["array"] + ] expr: Optional[str] # expression used in assign, if available value: Optional[Any] # solved value, if available @@ -21,7 +24,7 @@ class CompiledPortArray(BaseModel): class CompiledPort(BaseModel): - path: List[str] + path: str cls: str # self class # path of connected port, if connected # for block ports, this is either the link port or the exported port @@ -32,7 +35,7 @@ class CompiledPort(BaseModel): class CompiledLink(BaseModel): - path: List[str] + path: str cls: str # self class params: Dict[str, CompiledParam] ports: Dict[str, CompiledPort] @@ -40,7 +43,7 @@ class CompiledLink(BaseModel): class CompiledBlock(BaseModel): - path: List[str] + path: str cls: str # self class superclasses: List[str] # all superclasses params: Dict[str, CompiledParam] @@ -54,8 +57,8 @@ class CompiledDesignExportTransform(FnTransformBase[CompiledPort, CompiledBlock, """Transform a design into the CompiledBlock and friend data structure for export to a human-readable format.""" @staticmethod - def _path_to_path(path: Path) -> List[str]: - return list(path.to_tuple()) + def _path_to_path(path: Path) -> str: + return ".".join(path.to_tuple()) @staticmethod def _libpath_to_str(libpath: edgir.LibraryPath) -> str: From 5b335e385478831adc3a113e88b2bf79e99d77e1 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 25 Apr 2026 12:10:09 -0700 Subject: [PATCH 08/25] Update CompiledDesignExport.py --- edg/core/CompiledDesignExport.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/edg/core/CompiledDesignExport.py b/edg/core/CompiledDesignExport.py index f22d57a31..ba0e2c18c 100644 --- a/edg/core/CompiledDesignExport.py +++ b/edg/core/CompiledDesignExport.py @@ -8,9 +8,11 @@ """A compiled design, as a human-readable Pydantic / JSON-able version of the IR data structure.""" +PathType = str + class CompiledParam(BaseModel): - path: str + path: PathType # TODO support array sub-type type: Union[ Literal["floating"], Literal["integer"], Literal["boolean"], Literal["text"], Literal["range"], Literal["array"] @@ -24,18 +26,18 @@ class CompiledPortArray(BaseModel): class CompiledPort(BaseModel): - path: str + path: PathType cls: str # self class # path of connected port, if connected # for block ports, this is either the link port or the exported port # for link ports, this is the block port - connected_path: Optional[List[str]] + connected_path: Optional[List[PathType]] params: Dict[str, CompiledParam] ports: Dict[str, "CompiledPort"] class CompiledLink(BaseModel): - path: str + path: PathType cls: str # self class params: Dict[str, CompiledParam] ports: Dict[str, CompiledPort] @@ -43,7 +45,7 @@ class CompiledLink(BaseModel): class CompiledBlock(BaseModel): - path: str + path: PathType cls: str # self class superclasses: List[str] # all superclasses params: Dict[str, CompiledParam] @@ -57,7 +59,7 @@ class CompiledDesignExportTransform(FnTransformBase[CompiledPort, CompiledBlock, """Transform a design into the CompiledBlock and friend data structure for export to a human-readable format.""" @staticmethod - def _path_to_path(path: Path) -> str: + def _path_to_path(path: Path) -> PathType: return ".".join(path.to_tuple()) @staticmethod From 6bcbb36df1f6afd3f14872b72f155a59a9d5ef1f Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 25 Apr 2026 12:11:35 -0700 Subject: [PATCH 09/25] type cleaning --- edg/core/CompiledDesignExport.py | 5 ++++- edg/core/FnTransformUtil.py | 5 +++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/edg/core/CompiledDesignExport.py b/edg/core/CompiledDesignExport.py index ba0e2c18c..6a1743caa 100644 --- a/edg/core/CompiledDesignExport.py +++ b/edg/core/CompiledDesignExport.py @@ -1,4 +1,4 @@ -from typing import Optional, Dict, List, Any, Union, Mapping, Literal +from typing import Optional, Dict, List, Any, Union, Mapping, Literal, override from pydantic import BaseModel @@ -66,6 +66,7 @@ def _path_to_path(path: Path) -> PathType: def _libpath_to_str(libpath: edgir.LibraryPath) -> str: return libpath.target.name + @override def transform_block( self, context: TransformContext, @@ -93,6 +94,7 @@ def transform_block( links=dict(links), ) + @override def transform_port( self, context: TransformContext, @@ -107,6 +109,7 @@ def transform_port( ports=dict(ports), ) + @override def transform_link( self, context: TransformContext, diff --git a/edg/core/FnTransformUtil.py b/edg/core/FnTransformUtil.py index 3d4c04fc5..de3a96aa3 100644 --- a/edg/core/FnTransformUtil.py +++ b/edg/core/FnTransformUtil.py @@ -1,6 +1,7 @@ from typing import TypeVar, Generic, Mapping, Union, Dict from .. import edgir +from .ScalaCompilerInterface import CompiledDesign from .TransformUtil import TransformContext, Path # these type vars define the post-transform-result of blocks, ports, or links @@ -16,9 +17,9 @@ class FnTransformBase(Generic[TransformedPort, TransformedBlock, TransformedLink (through the `transform_*` methods, which are given the post-order results of their elements). """ - def transform(self, design: edgir.Design) -> TransformedBlock: + def transform(self, design: CompiledDesign) -> TransformedBlock: """Entry point for the transform. Transforms the design and returns the result.""" - context = TransformContext(Path.empty(), design) + context = TransformContext(Path.empty(), design.contents) return self.visit_block(context, design.contents) def _visit_portlike(self, context: TransformContext, elt: edgir.PortLike) -> TransformedPort: From 6730bc1b29334634d8a78c939b4c7d2b4fe59281 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 25 Apr 2026 13:46:05 -0700 Subject: [PATCH 10/25] improve json export --- edg/BoardCompiler.py | 6 +- edg/core/CompiledDesignExport.py | 101 +++++++++++++++++++++++-------- edg/core/FnTransformUtil.py | 12 ++-- edg/core/Range.py | 4 +- 4 files changed, 90 insertions(+), 33 deletions(-) diff --git a/edg/BoardCompiler.py b/edg/BoardCompiler.py index fadc90d4e..2aa3116e7 100644 --- a/edg/BoardCompiler.py +++ b/edg/BoardCompiler.py @@ -49,7 +49,7 @@ def compile_board(design: Type[Block], target_dir_name: Optional[Tuple[str, str] netlist_all = NetlistBackend().run(compiled) bom_all = GenerateBom().run(compiled) svgpcb_all = SvgPcbBackend().run(compiled) - compiled_json = CompiledDesignExportTransform().transform(compiled) + compiled_json = CompiledDesignExportTransform(compiled).transform() assert len(netlist_all) == 1 if target_dir_name is not None: @@ -64,7 +64,9 @@ def compile_board(design: Type[Block], target_dir_name: Optional[Tuple[str, str] svgpcb_file.write(svgpcb_all[0][1]) with open(compiled_json_filename, "w", encoding="utf-8") as compiled_json_file: - compiled_json_file.write(compiled_json.model_dump_json(indent=2)) + compiled_json_file.write( + CompiledDesignExportTransform.postprocess_serialized_json(compiled_json.model_dump_json(indent=2)) + ) return compiled diff --git a/edg/core/CompiledDesignExport.py b/edg/core/CompiledDesignExport.py index 6a1743caa..8277fefdb 100644 --- a/edg/core/CompiledDesignExport.py +++ b/edg/core/CompiledDesignExport.py @@ -1,10 +1,13 @@ from typing import Optional, Dict, List, Any, Union, Mapping, Literal, override +import re from pydantic import BaseModel -from edg import edgir -from edg.core.FnTransformUtil import FnTransformBase -from edg.core.TransformUtil import TransformContext, Path +from .. import edgir +from .ConstraintExpr import RangeExpr +from .Range import Range +from .FnTransformUtil import FnTransformBase +from .TransformUtil import TransformContext, Path """A compiled design, as a human-readable Pydantic / JSON-able version of the IR data structure.""" @@ -12,12 +15,8 @@ class CompiledParam(BaseModel): - path: PathType - # TODO support array sub-type - type: Union[ - Literal["floating"], Literal["integer"], Literal["boolean"], Literal["text"], Literal["range"], Literal["array"] - ] - expr: Optional[str] # expression used in assign, if available + # this is minimalistic so the output json is more compact + type: str value: Optional[Any] # solved value, if available @@ -26,7 +25,7 @@ class CompiledPortArray(BaseModel): class CompiledPort(BaseModel): - path: PathType + path: PathType # provide the full path to allow searchability cls: str # self class # path of connected port, if connected # for block ports, this is either the link port or the exported port @@ -37,7 +36,7 @@ class CompiledPort(BaseModel): class CompiledLink(BaseModel): - path: PathType + path: PathType # provide the full path to allow searchability cls: str # self class params: Dict[str, CompiledParam] ports: Dict[str, CompiledPort] @@ -45,7 +44,7 @@ class CompiledLink(BaseModel): class CompiledBlock(BaseModel): - path: PathType + path: PathType # provide the full path to allow searchability cls: str # self class superclasses: List[str] # all superclasses params: Dict[str, CompiledParam] @@ -56,7 +55,9 @@ class CompiledBlock(BaseModel): class CompiledDesignExportTransform(FnTransformBase[CompiledPort, CompiledBlock, CompiledLink]): - """Transform a design into the CompiledBlock and friend data structure for export to a human-readable format.""" + """Transform a design into the CompiledBlock and friends data structure for export to a human-readable format.""" + + _EXCLUDED_PARAM_VALUES = ["matching_parts"] @staticmethod def _path_to_path(path: Path) -> PathType: @@ -66,6 +67,40 @@ def _path_to_path(path: Path) -> PathType: def _libpath_to_str(libpath: edgir.LibraryPath) -> str: return libpath.target.name + @classmethod + def _param_to_type(cls, elt: edgir.ValInit) -> str: + param_type = elt.WhichOneof("val") + assert param_type is not None and param_type != "set" and param_type != "struct" + if param_type == "array": + return f"array({cls._param_to_type(elt.array)})" + return param_type + + def _param_to_compiled(self, path: Path, elt: edgir.ValInit) -> CompiledParam: + if path.params[-1] in self._EXCLUDED_PARAM_VALUES: + value = "" + else: + value = self.design.get_value(path.to_local_path()) + if isinstance(value, Range): # convert to Pydantic friendly + # JSON can't encode inf / -inf by standard, so convert to strings + if value == RangeExpr.EMPTY: + value = "∅" + else: + lower = value.lower + upper = value.upper + if lower == float("inf"): + lower = "inf" + elif lower == float("-inf"): + lower = "-inf" + if upper == float("inf"): + upper = "inf" + elif upper == float("-inf"): + upper = "-inf" + value = (lower, upper) + return CompiledParam( + type=self._param_to_type(elt), + value=value, + ) + @override def transform_block( self, @@ -81,12 +116,7 @@ def transform_block( superclasses=[self._libpath_to_str(cls) for cls in elt.superclasses] + [self._libpath_to_str(cls) for cls in elt.super_superclasses], params={ - param_pair.name: CompiledParam( - path=self._path_to_path(context.path.append_param(param_pair.name)), - type=param_pair.value.WhichOneof("val"), - expr=None, # TODO IMPLEMENT ME - value=None, # TODO IMPLEMENT ME - ) + param_pair.name: self._param_to_compiled(context.path.append_param(param_pair.name), param_pair.value) for param_pair in elt.params }, ports=dict(ports), @@ -101,11 +131,19 @@ def transform_port( elt: Union[edgir.Port, edgir.PortArray], ports: Mapping[str, CompiledPort], ) -> CompiledPort: + if isinstance(elt, edgir.Port): + params = { + param_pair.name: self._param_to_compiled(context.path.append_param(param_pair.name), param_pair.value) + for param_pair in elt.params + } + else: + params = {} + return CompiledPort( path=self._path_to_path(context.path), cls=self._libpath_to_str(elt.self_class), connected_path=None, # TODO IMPLEMENT ME - params={}, # TODO IMPLEMENT ME + params=params, ports=dict(ports), ) @@ -121,14 +159,25 @@ def transform_link( path=self._path_to_path(context.path), cls=self._libpath_to_str(elt.self_class), params={ - param_pair.name: CompiledParam( - path=self._path_to_path(context.path.append_param(param_pair.name)), - type=param_pair.value.WhichOneof("val"), - expr=None, # TODO IMPLEMENT ME - value=None, # TODO IMPLEMENT ME - ) + param_pair.name: self._param_to_compiled(context.path.append_param(param_pair.name), param_pair.value) for param_pair in elt.params }, ports=dict(ports), links=dict(links), ) + + @staticmethod + def postprocess_serialized_json(json_str: str) -> str: + # post-process the json string to compactify the param dict and range lists + # compress range lists onto one line + json_str = re.sub( + r""""type":\s*"range",(\s*)"value":\s*\[\s*([\S]+),\s*([\S]+)\s*\]""", + lambda m: f""""type": "range",{m.group(1)}"value": [{m.group(2)}, {m.group(3)}]""", + json_str, + ) + json_str = re.sub( + r"""\{\s*"type":\s*"(\S+)",\s*"value":\s*(.+)\s*\}""", + lambda m: f"""{{ "type": "{m.group(1)}", "value": {m.group(2)} }}""", + json_str, + ) + return json_str diff --git a/edg/core/FnTransformUtil.py b/edg/core/FnTransformUtil.py index de3a96aa3..78e35e3cb 100644 --- a/edg/core/FnTransformUtil.py +++ b/edg/core/FnTransformUtil.py @@ -17,10 +17,14 @@ class FnTransformBase(Generic[TransformedPort, TransformedBlock, TransformedLink (through the `transform_*` methods, which are given the post-order results of their elements). """ - def transform(self, design: CompiledDesign) -> TransformedBlock: - """Entry point for the transform. Transforms the design and returns the result.""" - context = TransformContext(Path.empty(), design.contents) - return self.visit_block(context, design.contents) + def __init__(self, design: CompiledDesign) -> None: + self.design = design + + def transform(self) -> TransformedBlock: + """Entry point for the transform. Transforms the design and returns the result. + Should only be called once per object, undefined behavior if called multiple times.""" + context = TransformContext(Path.empty(), self.design.contents) + return self.visit_block(context, self.design.contents) def _visit_portlike(self, context: TransformContext, elt: edgir.PortLike) -> TransformedPort: if elt.HasField("port"): diff --git a/edg/core/Range.py b/edg/core/Range.py index f4ee301b4..a1b0c4ad4 100644 --- a/edg/core/Range.py +++ b/edg/core/Range.py @@ -135,7 +135,9 @@ def __init__(self, lower: float, upper: float) -> None: def __eq__(self, other: Any) -> bool: if not isinstance(other, Range): return False - return self.lower == other.lower and self.upper == other.upper + return (self.lower == other.lower and self.upper == other.upper) or ( + math.isnan(self.lower) and math.isnan(other.lower) and math.isnan(self.upper) and math.isnan(other.upper) + ) def center(self) -> float: return (self.lower + self.upper) / 2 From 7b6645e754c75fd987188f9c781d6688cac86e29 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 25 Apr 2026 13:55:37 -0700 Subject: [PATCH 11/25] Update CompiledDesignExport.py --- edg/core/CompiledDesignExport.py | 1 + 1 file changed, 1 insertion(+) diff --git a/edg/core/CompiledDesignExport.py b/edg/core/CompiledDesignExport.py index 8277fefdb..c9182600b 100644 --- a/edg/core/CompiledDesignExport.py +++ b/edg/core/CompiledDesignExport.py @@ -57,6 +57,7 @@ class CompiledBlock(BaseModel): class CompiledDesignExportTransform(FnTransformBase[CompiledPort, CompiledBlock, CompiledLink]): """Transform a design into the CompiledBlock and friends data structure for export to a human-readable format.""" + # these values are excluded since they're very large and not very useful _EXCLUDED_PARAM_VALUES = ["matching_parts"] @staticmethod From 30264b9db8614e2f6786e01bf52ee64d0a7575e2 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 25 Apr 2026 13:58:22 -0700 Subject: [PATCH 12/25] Update CompiledDesignExport.py --- edg/core/CompiledDesignExport.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/edg/core/CompiledDesignExport.py b/edg/core/CompiledDesignExport.py index c9182600b..31d28aa7e 100644 --- a/edg/core/CompiledDesignExport.py +++ b/edg/core/CompiledDesignExport.py @@ -78,7 +78,7 @@ def _param_to_type(cls, elt: edgir.ValInit) -> str: def _param_to_compiled(self, path: Path, elt: edgir.ValInit) -> CompiledParam: if path.params[-1] in self._EXCLUDED_PARAM_VALUES: - value = "" + value: Optional[Any] = "" else: value = self.design.get_value(path.to_local_path()) if isinstance(value, Range): # convert to Pydantic friendly @@ -86,8 +86,8 @@ def _param_to_compiled(self, path: Path, elt: edgir.ValInit) -> CompiledParam: if value == RangeExpr.EMPTY: value = "∅" else: - lower = value.lower - upper = value.upper + lower: Union[float, str] = value.lower + upper: Union[float, str] = value.upper if lower == float("inf"): lower = "inf" elif lower == float("-inf"): From 1590aefc47f954f65d8867069f2b3efa0ae1472c Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 25 Apr 2026 14:10:29 -0700 Subject: [PATCH 13/25] add connection data --- edg/edgir/common_pb2.py | 12 +- edg/edgir/common_pb2.pyi | 205 ++++------ edg/edgir/elem_pb2.py | 13 +- edg/edgir/elem_pb2.pyi | 619 ++++++++++++++---------------- edg/edgir/expr_pb2.py | 13 +- edg/edgir/expr_pb2.pyi | 724 ++++++++++++++++-------------------- edg/edgir/impl_pb2.py | 11 +- edg/edgir/impl_pb2.pyi | 68 ++-- edg/edgir/init_pb2.py | 11 +- edg/edgir/init_pb2.pyi | 124 +++--- edg/edgir/lit_pb2.py | 13 +- edg/edgir/lit_pb2.pyi | 209 +++++------ edg/edgir/name_pb2.py | 11 +- edg/edgir/name_pb2.pyi | 45 ++- edg/edgir/ref_pb2.py | 11 +- edg/edgir/ref_pb2.pyi | 128 +++---- edg/edgir/schema_pb2.py | 13 +- edg/edgir/schema_pb2.pyi | 171 ++++----- edg/edgrpc/compiler_pb2.py | 17 +- edg/edgrpc/compiler_pb2.pyi | 144 ++++--- edg/edgrpc/hdl_pb2.py | 13 +- edg/edgrpc/hdl_pb2.pyi | 599 +++++++++++++---------------- proto/edgrpc/compiler.proto | 6 + 23 files changed, 1418 insertions(+), 1762 deletions(-) diff --git a/edg/edgir/common_pb2.py b/edg/edgir/common_pb2.py index a88fe9b8c..01c1565e4 100644 --- a/edg/edgir/common_pb2.py +++ b/edg/edgir/common_pb2.py @@ -1,20 +1,16 @@ """Generated protocol buffer code.""" - from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database - _sym_db = _symbol_database.Default() -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\x12edgir/common.proto\x12\x0cedgir.common"\x95\x03\n\x08Metadata\x12&\n\x07unknown\x18\x01 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12\x0f\n\x05known\x18\x02 \x01(\tH\x00\x121\n\x07members\x18e \x01(\x0b2\x1e.edgir.common.Metadata.MembersH\x01\x12\x13\n\ttext_leaf\x18f \x01(\tH\x01\x12\x12\n\x08bin_leaf\x18g \x01(\x0cH\x01\x125\n\x0esource_locator\x18n \x01(\x0b2\x1b.edgir.common.SourceLocatorH\x01\x12$\n\x05error\x18p \x01(\x0b2\x13.edgir.common.ErrorH\x01\x1a\x86\x01\n\x07Members\x126\n\x04node\x18\n \x03(\x0b2(.edgir.common.Metadata.Members.NodeEntry\x1aC\n\tNodeEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12%\n\x05value\x18\x02 \x01(\x0b2\x16.edgir.common.Metadata:\x028\x01B\x06\n\x04typeB\x06\n\x04meta"\xc9\x01\n\rSourceLocator\x12\x14\n\x0cfile_package\x18\x01 \x01(\t\x12\x13\n\x0bline_offset\x18\x02 \x01(\x05\x12\x12\n\ncol_offset\x18\x03 \x01(\x05\x12;\n\x0bsource_type\x18\x04 \x01(\x0e2&.edgir.common.SourceLocator.SourceType"<\n\nSourceType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0e\n\nDEFINITION\x10\x01\x12\x11\n\rINSTANTIATION\x10\x02"X\n\x05Error\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x11\n\ttraceback\x18\x03 \x01(\t\x12+\n\x06source\x18\x02 \x03(\x0b2\x1b.edgir.common.SourceLocator"\x07\n\x05Emptyb\x06proto3' -) +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12edgir/common.proto\x12\x0cedgir.common"\x95\x03\n\x08Metadata\x12&\n\x07unknown\x18\x01 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12\x0f\n\x05known\x18\x02 \x01(\tH\x00\x121\n\x07members\x18e \x01(\x0b2\x1e.edgir.common.Metadata.MembersH\x01\x12\x13\n\ttext_leaf\x18f \x01(\tH\x01\x12\x12\n\x08bin_leaf\x18g \x01(\x0cH\x01\x125\n\x0esource_locator\x18n \x01(\x0b2\x1b.edgir.common.SourceLocatorH\x01\x12$\n\x05error\x18p \x01(\x0b2\x13.edgir.common.ErrorH\x01\x1a\x86\x01\n\x07Members\x126\n\x04node\x18\n \x03(\x0b2(.edgir.common.Metadata.Members.NodeEntry\x1aC\n\tNodeEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12%\n\x05value\x18\x02 \x01(\x0b2\x16.edgir.common.Metadata:\x028\x01B\x06\n\x04typeB\x06\n\x04meta"\xc9\x01\n\rSourceLocator\x12\x14\n\x0cfile_package\x18\x01 \x01(\t\x12\x13\n\x0bline_offset\x18\x02 \x01(\x05\x12\x12\n\ncol_offset\x18\x03 \x01(\x05\x12;\n\x0bsource_type\x18\x04 \x01(\x0e2&.edgir.common.SourceLocator.SourceType"<\n\nSourceType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0e\n\nDEFINITION\x10\x01\x12\x11\n\rINSTANTIATION\x10\x02"X\n\x05Error\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x11\n\ttraceback\x18\x03 \x01(\t\x12+\n\x06source\x18\x02 \x03(\x0b2\x1b.edgir.common.SourceLocator"\x07\n\x05Emptyb\x06proto3') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "edgir.common_pb2", globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'edgir.common_pb2', globals()) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None _METADATA_MEMBERS_NODEENTRY._options = None - _METADATA_MEMBERS_NODEENTRY._serialized_options = b"8\x01" + _METADATA_MEMBERS_NODEENTRY._serialized_options = b'8\x01' _METADATA._serialized_start = 37 _METADATA._serialized_end = 442 _METADATA_MEMBERS._serialized_start = 292 @@ -28,4 +24,4 @@ _ERROR._serialized_start = 648 _ERROR._serialized_end = 736 _EMPTY._serialized_start = 738 - _EMPTY._serialized_end = 745 + _EMPTY._serialized_end = 745 \ No newline at end of file diff --git a/edg/edgir/common_pb2.pyi b/edg/edgir/common_pb2.pyi index 4fa8ab79c..bad85ffc9 100644 --- a/edg/edgir/common_pb2.pyi +++ b/edg/edgir/common_pb2.pyi @@ -7,7 +7,6 @@ Package : edg.common This is where we keep shared types that we reuse and don't have a good place for. """ - from collections import abc as _abc from google.protobuf import descriptor as _descriptor from google.protobuf import message as _message @@ -16,7 +15,6 @@ from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper import builtins as _builtins import sys import typing as _typing - if sys.version_info >= (3, 10): from typing import TypeAlias as _TypeAlias else: @@ -26,7 +24,6 @@ DESCRIPTOR: _descriptor.FileDescriptor @_typing.final class Metadata(_message.Message): """* Arbitrary metadata stored in tree form.""" - DESCRIPTOR: _descriptor.Descriptor @_typing.final @@ -41,24 +38,31 @@ class Metadata(_message.Message): key: _builtins.str @_builtins.property - def value(self) -> Global___Metadata: ... - def __init__(self, *, key: _builtins.str = ..., value: Global___Metadata | None = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["value", b"value"] + def value(self) -> Global___Metadata: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["key", b"key", "value", b"value"] + def __init__(self, *, key: _builtins.str=..., value: Global___Metadata | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['value', b'value'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['key', b'key', 'value', b'value'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... NODE_FIELD_NUMBER: _builtins.int @_builtins.property - def node(self) -> _containers.MessageMap[_builtins.str, Global___Metadata]: ... - def __init__(self, *, node: _abc.Mapping[_builtins.str, Global___Metadata] | None = ...) -> None: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["node", b"node"] + def node(self) -> _containers.MessageMap[_builtins.str, Global___Metadata]: + ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def __init__(self, *, node: _abc.Mapping[_builtins.str, Global___Metadata] | None=...) -> None: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['node', b'node'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... UNKNOWN_FIELD_NUMBER: _builtins.int KNOWN_FIELD_NUMBER: _builtins.int MEMBERS_FIELD_NUMBER: _builtins.int @@ -69,12 +73,16 @@ class Metadata(_message.Message): known: _builtins.str text_leaf: _builtins.str bin_leaf: _builtins.bytes - "* I wanted to split binary and text data, since we might\n just want to dump a raw file/image/datasheet in here\n for safekeeping.\n\n Mixing up binary and textual formats is just a recipe\n for trouble.\n " + '* I wanted to split binary and text data, since we might\n just want to dump a raw file/image/datasheet in here\n for safekeeping.\n\n Mixing up binary and textual formats is just a recipe\n for trouble.\n ' @_builtins.property - def unknown(self) -> Global___Empty: ... + def unknown(self) -> Global___Empty: + ... + @_builtins.property - def members(self) -> Global___Metadata.Members: ... + def members(self) -> Global___Metadata.Members: + ... + @_builtins.property def source_locator(self) -> Global___SourceLocator: """Defined formats @@ -83,74 +91,31 @@ class Metadata(_message.Message): """ @_builtins.property - def error(self) -> Global___Error: ... - def __init__( - self, - *, - unknown: Global___Empty | None = ..., - known: _builtins.str = ..., - members: Global___Metadata.Members | None = ..., - text_leaf: _builtins.str = ..., - bin_leaf: _builtins.bytes = ..., - source_locator: Global___SourceLocator | None = ..., - error: Global___Error | None = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal[ - "bin_leaf", - b"bin_leaf", - "error", - b"error", - "known", - b"known", - "members", - b"members", - "meta", - b"meta", - "source_locator", - b"source_locator", - "text_leaf", - b"text_leaf", - "type", - b"type", - "unknown", - b"unknown", - ] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "bin_leaf", - b"bin_leaf", - "error", - b"error", - "known", - b"known", - "members", - b"members", - "meta", - b"meta", - "source_locator", - b"source_locator", - "text_leaf", - b"text_leaf", - "type", - b"type", - "unknown", - b"unknown", - ] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - _WhichOneofReturnType_meta: _TypeAlias = _typing.Literal[ - "members", "text_leaf", "bin_leaf", "source_locator", "error" - ] - _WhichOneofArgType_meta: _TypeAlias = _typing.Literal["meta", b"meta"] - _WhichOneofReturnType_type: _TypeAlias = _typing.Literal["unknown", "known"] - _WhichOneofArgType_type: _TypeAlias = _typing.Literal["type", b"type"] + def error(self) -> Global___Error: + ... + + def __init__(self, *, unknown: Global___Empty | None=..., known: _builtins.str=..., members: Global___Metadata.Members | None=..., text_leaf: _builtins.str=..., bin_leaf: _builtins.bytes=..., source_locator: Global___SourceLocator | None=..., error: Global___Error | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['bin_leaf', b'bin_leaf', 'error', b'error', 'known', b'known', 'members', b'members', 'meta', b'meta', 'source_locator', b'source_locator', 'text_leaf', b'text_leaf', 'type', b'type', 'unknown', b'unknown'] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['bin_leaf', b'bin_leaf', 'error', b'error', 'known', b'known', 'members', b'members', 'meta', b'meta', 'source_locator', b'source_locator', 'text_leaf', b'text_leaf', 'type', b'type', 'unknown', b'unknown'] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... + _WhichOneofReturnType_meta: _TypeAlias = _typing.Literal['members', 'text_leaf', 'bin_leaf', 'source_locator', 'error'] + _WhichOneofArgType_meta: _TypeAlias = _typing.Literal['meta', b'meta'] + _WhichOneofReturnType_type: _TypeAlias = _typing.Literal['unknown', 'known'] + _WhichOneofArgType_type: _TypeAlias = _typing.Literal['type', b'type'] @_typing.overload - def WhichOneof(self, oneof_group: _WhichOneofArgType_meta) -> _WhichOneofReturnType_meta | None: ... - @_typing.overload - def WhichOneof(self, oneof_group: _WhichOneofArgType_type) -> _WhichOneofReturnType_type | None: ... + def WhichOneof(self, oneof_group: _WhichOneofArgType_meta) -> _WhichOneofReturnType_meta | None: + ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType_type) -> _WhichOneofReturnType_type | None: + ... Global___Metadata: _TypeAlias = Metadata @_typing.final @@ -159,62 +124,45 @@ class SourceLocator(_message.Message): * For locating source data """ - DESCRIPTOR: _descriptor.Descriptor class _SourceType: - ValueType = _typing.NewType("ValueType", _builtins.int) + ValueType = _typing.NewType('ValueType', _builtins.int) V: _TypeAlias = ValueType - class _SourceTypeEnumTypeWrapper( - _enum_type_wrapper._EnumTypeWrapper[SourceLocator._SourceType.ValueType], _builtins.type - ): + class _SourceTypeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[SourceLocator._SourceType.ValueType], _builtins.type): DESCRIPTOR: _descriptor.EnumDescriptor UNKNOWN: SourceLocator._SourceType.ValueType DEFINITION: SourceLocator._SourceType.ValueType - "source defining this class, would be present in library" + 'source defining this class, would be present in library' INSTANTIATION: SourceLocator._SourceType.ValueType - "source of instantiation, would be present in design" + 'source of instantiation, would be present in design' - class SourceType(_SourceType, metaclass=_SourceTypeEnumTypeWrapper): ... + class SourceType(_SourceType, metaclass=_SourceTypeEnumTypeWrapper): + ... UNKNOWN: SourceLocator.SourceType.ValueType DEFINITION: SourceLocator.SourceType.ValueType - "source defining this class, would be present in library" + 'source defining this class, would be present in library' INSTANTIATION: SourceLocator.SourceType.ValueType - "source of instantiation, would be present in design" + 'source of instantiation, would be present in design' FILE_PACKAGE_FIELD_NUMBER: _builtins.int LINE_OFFSET_FIELD_NUMBER: _builtins.int COL_OFFSET_FIELD_NUMBER: _builtins.int SOURCE_TYPE_FIELD_NUMBER: _builtins.int file_package: _builtins.str - "package name (portable, not tied to an absolute path) that locates the file" + 'package name (portable, not tied to an absolute path) that locates the file' line_offset: _builtins.int - "line number" + 'line number' col_offset: _builtins.int - "character offset within the line" + 'character offset within the line' source_type: Global___SourceLocator.SourceType.ValueType - def __init__( - self, - *, - file_package: _builtins.str = ..., - line_offset: _builtins.int = ..., - col_offset: _builtins.int = ..., - source_type: Global___SourceLocator.SourceType.ValueType = ..., - ) -> None: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "col_offset", - b"col_offset", - "file_package", - b"file_package", - "line_offset", - b"line_offset", - "source_type", - b"source_type", - ] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def __init__(self, *, file_package: _builtins.str=..., line_offset: _builtins.int=..., col_offset: _builtins.int=..., source_type: Global___SourceLocator.SourceType.ValueType=...) -> None: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['col_offset', b'col_offset', 'file_package', b'file_package', 'line_offset', b'line_offset', 'source_type', b'source_type'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___SourceLocator: _TypeAlias = SourceLocator @_typing.final @@ -222,41 +170,32 @@ class Error(_message.Message): """* Used to communicate results of analysis / checking passes. Limited to Block and Link objects. """ - DESCRIPTOR: _descriptor.Descriptor MESSAGE_FIELD_NUMBER: _builtins.int TRACEBACK_FIELD_NUMBER: _builtins.int SOURCE_FIELD_NUMBER: _builtins.int message: _builtins.str - "free-form error message" + 'free-form error message' traceback: _builtins.str - "full traceback TODO: should there be a structured stack trace?" + 'full traceback TODO: should there be a structured stack trace?' @_builtins.property def source(self) -> _containers.RepeatedCompositeFieldContainer[Global___SourceLocator]: """source locator, eg line of failing constraint""" - def __init__( - self, - *, - message: _builtins.str = ..., - traceback: _builtins.str = ..., - source: _abc.Iterable[Global___SourceLocator] | None = ..., - ) -> None: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "message", b"message", "source", b"source", "traceback", b"traceback" - ] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def __init__(self, *, message: _builtins.str=..., traceback: _builtins.str=..., source: _abc.Iterable[Global___SourceLocator] | None=...) -> None: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['message', b'message', 'source', b'source', 'traceback', b'traceback'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___Error: _TypeAlias = Error @_typing.final class Empty(_message.Message): """* Placeholder until I figure out how to import properly""" - DESCRIPTOR: _descriptor.Descriptor - def __init__(self) -> None: ... - -Global___Empty: _TypeAlias = Empty + def __init__(self) -> None: + ... +Global___Empty: _TypeAlias = Empty \ No newline at end of file diff --git a/edg/edgir/elem_pb2.py b/edg/edgir/elem_pb2.py index 5b5633fd0..1848baf86 100644 --- a/edg/edgir/elem_pb2.py +++ b/edg/edgir/elem_pb2.py @@ -1,25 +1,20 @@ """Generated protocol buffer code.""" - from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database - _sym_db = _symbol_database.Default() from ..edgir import common_pb2 as edgir_dot_common__pb2 from ..edgir import init_pb2 as edgir_dot_init__pb2 from ..edgir import expr_pb2 as edgir_dot_expr__pb2 from ..edgir import ref_pb2 as edgir_dot_ref__pb2 - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\x10edgir/elem.proto\x12\nedgir.elem\x1a\x12edgir/common.proto\x1a\x10edgir/init.proto\x1a\x10edgir/expr.proto\x1a\x0fedgir/ref.proto"@\n\x0cNamedValInit\x12\x0c\n\x04name\x18\x01 \x01(\t\x12"\n\x05value\x18\x02 \x01(\x0b2\x13.edgir.init.ValInit"D\n\x0eNamedValueExpr\x12\x0c\n\x04name\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr"B\n\rNamedPortLike\x12\x0c\n\x04name\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b2\x14.edgir.elem.PortLike"D\n\x0eNamedBlockLike\x12\x0c\n\x04name\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b2\x15.edgir.elem.BlockLike"B\n\rNamedLinkLike\x12\x0c\n\x04name\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b2\x14.edgir.elem.LinkLike"\xbf\x02\n\x04Port\x12(\n\x06params\x18( \x03(\x0b2\x18.edgir.elem.NamedValInit\x12/\n\x0bconstraints\x18) \x03(\x0b2\x1a.edgir.elem.NamedValueExpr\x12(\n\x05ports\x18* \x03(\x0b2\x19.edgir.elem.NamedPortLike\x12*\n\nself_class\x18\x14 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12,\n\x0csuperclasses\x18\x15 \x03(\x0b2\x16.edgir.ref.LibraryPath\x122\n\x12super_superclasses\x18\x18 \x03(\x0b2\x16.edgir.ref.LibraryPath\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata"\xca\x01\n\tPortArray\x12*\n\nself_class\x18\x14 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12,\n\x05ports\x18\x0e \x01(\x0b2\x1b.edgir.elem.PortArray.PortsH\x00\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata\x1a1\n\x05Ports\x12(\n\x05ports\x18( \x03(\x0b2\x19.edgir.elem.NamedPortLikeB\n\n\x08contains"\xb0\x01\n\x08PortLike\x12(\n\tundefined\x18\x01 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12*\n\x08lib_elem\x18\x02 \x01(\x0b2\x16.edgir.ref.LibraryPathH\x00\x12 \n\x04port\x18\x03 \x01(\x0b2\x10.edgir.elem.PortH\x00\x12&\n\x05array\x18\x04 \x01(\x0b2\x15.edgir.elem.PortArrayH\x00B\x04\n\x02is"=\n\tParameter\x12"\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12\x0c\n\x04unit\x18\x02 \x01(\t"a\n\x18StringDescriptionElement\x12\x0e\n\x04text\x18\x01 \x01(\tH\x00\x12&\n\x05param\x18\x02 \x01(\x0b2\x15.edgir.elem.ParameterH\x00B\r\n\x0bElementType"\xc4\x06\n\x0eHierarchyBlock\x12(\n\x06params\x18( \x03(\x0b2\x18.edgir.elem.NamedValInit\x12E\n\x0eparam_defaults\x18\x0f \x03(\x0b2-.edgir.elem.HierarchyBlock.ParamDefaultsEntry\x12(\n\x05ports\x18) \x03(\x0b2\x19.edgir.elem.NamedPortLike\x12*\n\x06blocks\x18* \x03(\x0b2\x1a.edgir.elem.NamedBlockLike\x12(\n\x05links\x18+ \x03(\x0b2\x19.edgir.elem.NamedLinkLike\x12/\n\x0bconstraints\x18, \x03(\x0b2\x1a.edgir.elem.NamedValueExpr\x12*\n\nself_class\x18\x17 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12,\n\x0csuperclasses\x18\x14 \x03(\x0b2\x16.edgir.ref.LibraryPath\x122\n\x12super_superclasses\x18\x18 \x03(\x0b2\x16.edgir.ref.LibraryPath\x12/\n\x0fprerefine_class\x18\x15 \x01(\x0b2\x16.edgir.ref.LibraryPath\x120\n\x10prerefine_mixins\x18\x19 \x03(\x0b2\x16.edgir.ref.LibraryPath\x12(\n\tgenerator\x18\x16 \x01(\x0b2\x15.edgir.elem.Generator\x12\x13\n\x0bis_abstract\x18\x1e \x01(\x08\x122\n\x12default_refinement\x18\x1f \x01(\x0b2\x16.edgir.ref.LibraryPath\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata\x129\n\x0bdescription\x18\x01 \x03(\x0b2$.edgir.elem.StringDescriptionElement\x1aK\n\x12ParamDefaultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr:\x028\x01":\n\tGenerator\x12-\n\x0frequired_params\x18\x02 \x03(\x0b2\x14.edgir.ref.LocalPath"\\\n\x0cBlockLibrary\x12$\n\x04base\x18\x02 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12&\n\x06mixins\x18\x03 \x03(\x0b2\x16.edgir.ref.LibraryPath"\x9c\x01\n\tBlockLike\x12(\n\tundefined\x18\x01 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12,\n\x08lib_elem\x18\x05 \x01(\x0b2\x18.edgir.elem.BlockLibraryH\x00\x12/\n\thierarchy\x18\x04 \x01(\x0b2\x1a.edgir.elem.HierarchyBlockH\x00B\x06\n\x04type"\xa4\x03\n\x04Link\x12(\n\x06params\x18( \x03(\x0b2\x18.edgir.elem.NamedValInit\x12(\n\x05ports\x18) \x03(\x0b2\x19.edgir.elem.NamedPortLike\x12(\n\x05links\x18+ \x03(\x0b2\x19.edgir.elem.NamedLinkLike\x12/\n\x0bconstraints\x18* \x03(\x0b2\x1a.edgir.elem.NamedValueExpr\x12*\n\nself_class\x18\x14 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12,\n\x0csuperclasses\x18\x15 \x03(\x0b2\x16.edgir.ref.LibraryPath\x122\n\x12super_superclasses\x18\x18 \x03(\x0b2\x16.edgir.ref.LibraryPath\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata\x129\n\x0bdescription\x18\x01 \x03(\x0b2$.edgir.elem.StringDescriptionElement"\xe2\x01\n\tLinkArray\x12*\n\nself_class\x18\x14 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12(\n\x05ports\x18) \x03(\x0b2\x19.edgir.elem.NamedPortLike\x12/\n\x0bconstraints\x18* \x03(\x0b2\x1a.edgir.elem.NamedValueExpr\x12(\n\x05links\x18+ \x03(\x0b2\x19.edgir.elem.NamedLinkLike\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata"\xb2\x01\n\x08LinkLike\x12(\n\tundefined\x18\x01 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12*\n\x08lib_elem\x18\x02 \x01(\x0b2\x16.edgir.ref.LibraryPathH\x00\x12 \n\x04link\x18\x03 \x01(\x0b2\x10.edgir.elem.LinkH\x00\x12&\n\x05array\x18\x04 \x01(\x0b2\x15.edgir.elem.LinkArrayH\x00B\x06\n\x04typeb\x06proto3' -) +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10edgir/elem.proto\x12\nedgir.elem\x1a\x12edgir/common.proto\x1a\x10edgir/init.proto\x1a\x10edgir/expr.proto\x1a\x0fedgir/ref.proto"@\n\x0cNamedValInit\x12\x0c\n\x04name\x18\x01 \x01(\t\x12"\n\x05value\x18\x02 \x01(\x0b2\x13.edgir.init.ValInit"D\n\x0eNamedValueExpr\x12\x0c\n\x04name\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr"B\n\rNamedPortLike\x12\x0c\n\x04name\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b2\x14.edgir.elem.PortLike"D\n\x0eNamedBlockLike\x12\x0c\n\x04name\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b2\x15.edgir.elem.BlockLike"B\n\rNamedLinkLike\x12\x0c\n\x04name\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b2\x14.edgir.elem.LinkLike"\xbf\x02\n\x04Port\x12(\n\x06params\x18( \x03(\x0b2\x18.edgir.elem.NamedValInit\x12/\n\x0bconstraints\x18) \x03(\x0b2\x1a.edgir.elem.NamedValueExpr\x12(\n\x05ports\x18* \x03(\x0b2\x19.edgir.elem.NamedPortLike\x12*\n\nself_class\x18\x14 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12,\n\x0csuperclasses\x18\x15 \x03(\x0b2\x16.edgir.ref.LibraryPath\x122\n\x12super_superclasses\x18\x18 \x03(\x0b2\x16.edgir.ref.LibraryPath\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata"\xca\x01\n\tPortArray\x12*\n\nself_class\x18\x14 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12,\n\x05ports\x18\x0e \x01(\x0b2\x1b.edgir.elem.PortArray.PortsH\x00\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata\x1a1\n\x05Ports\x12(\n\x05ports\x18( \x03(\x0b2\x19.edgir.elem.NamedPortLikeB\n\n\x08contains"\xb0\x01\n\x08PortLike\x12(\n\tundefined\x18\x01 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12*\n\x08lib_elem\x18\x02 \x01(\x0b2\x16.edgir.ref.LibraryPathH\x00\x12 \n\x04port\x18\x03 \x01(\x0b2\x10.edgir.elem.PortH\x00\x12&\n\x05array\x18\x04 \x01(\x0b2\x15.edgir.elem.PortArrayH\x00B\x04\n\x02is"=\n\tParameter\x12"\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12\x0c\n\x04unit\x18\x02 \x01(\t"a\n\x18StringDescriptionElement\x12\x0e\n\x04text\x18\x01 \x01(\tH\x00\x12&\n\x05param\x18\x02 \x01(\x0b2\x15.edgir.elem.ParameterH\x00B\r\n\x0bElementType"\xc4\x06\n\x0eHierarchyBlock\x12(\n\x06params\x18( \x03(\x0b2\x18.edgir.elem.NamedValInit\x12E\n\x0eparam_defaults\x18\x0f \x03(\x0b2-.edgir.elem.HierarchyBlock.ParamDefaultsEntry\x12(\n\x05ports\x18) \x03(\x0b2\x19.edgir.elem.NamedPortLike\x12*\n\x06blocks\x18* \x03(\x0b2\x1a.edgir.elem.NamedBlockLike\x12(\n\x05links\x18+ \x03(\x0b2\x19.edgir.elem.NamedLinkLike\x12/\n\x0bconstraints\x18, \x03(\x0b2\x1a.edgir.elem.NamedValueExpr\x12*\n\nself_class\x18\x17 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12,\n\x0csuperclasses\x18\x14 \x03(\x0b2\x16.edgir.ref.LibraryPath\x122\n\x12super_superclasses\x18\x18 \x03(\x0b2\x16.edgir.ref.LibraryPath\x12/\n\x0fprerefine_class\x18\x15 \x01(\x0b2\x16.edgir.ref.LibraryPath\x120\n\x10prerefine_mixins\x18\x19 \x03(\x0b2\x16.edgir.ref.LibraryPath\x12(\n\tgenerator\x18\x16 \x01(\x0b2\x15.edgir.elem.Generator\x12\x13\n\x0bis_abstract\x18\x1e \x01(\x08\x122\n\x12default_refinement\x18\x1f \x01(\x0b2\x16.edgir.ref.LibraryPath\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata\x129\n\x0bdescription\x18\x01 \x03(\x0b2$.edgir.elem.StringDescriptionElement\x1aK\n\x12ParamDefaultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr:\x028\x01":\n\tGenerator\x12-\n\x0frequired_params\x18\x02 \x03(\x0b2\x14.edgir.ref.LocalPath"\\\n\x0cBlockLibrary\x12$\n\x04base\x18\x02 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12&\n\x06mixins\x18\x03 \x03(\x0b2\x16.edgir.ref.LibraryPath"\x9c\x01\n\tBlockLike\x12(\n\tundefined\x18\x01 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12,\n\x08lib_elem\x18\x05 \x01(\x0b2\x18.edgir.elem.BlockLibraryH\x00\x12/\n\thierarchy\x18\x04 \x01(\x0b2\x1a.edgir.elem.HierarchyBlockH\x00B\x06\n\x04type"\xa4\x03\n\x04Link\x12(\n\x06params\x18( \x03(\x0b2\x18.edgir.elem.NamedValInit\x12(\n\x05ports\x18) \x03(\x0b2\x19.edgir.elem.NamedPortLike\x12(\n\x05links\x18+ \x03(\x0b2\x19.edgir.elem.NamedLinkLike\x12/\n\x0bconstraints\x18* \x03(\x0b2\x1a.edgir.elem.NamedValueExpr\x12*\n\nself_class\x18\x14 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12,\n\x0csuperclasses\x18\x15 \x03(\x0b2\x16.edgir.ref.LibraryPath\x122\n\x12super_superclasses\x18\x18 \x03(\x0b2\x16.edgir.ref.LibraryPath\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata\x129\n\x0bdescription\x18\x01 \x03(\x0b2$.edgir.elem.StringDescriptionElement"\xe2\x01\n\tLinkArray\x12*\n\nself_class\x18\x14 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12(\n\x05ports\x18) \x03(\x0b2\x19.edgir.elem.NamedPortLike\x12/\n\x0bconstraints\x18* \x03(\x0b2\x1a.edgir.elem.NamedValueExpr\x12(\n\x05links\x18+ \x03(\x0b2\x19.edgir.elem.NamedLinkLike\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata"\xb2\x01\n\x08LinkLike\x12(\n\tundefined\x18\x01 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12*\n\x08lib_elem\x18\x02 \x01(\x0b2\x16.edgir.ref.LibraryPathH\x00\x12 \n\x04link\x18\x03 \x01(\x0b2\x10.edgir.elem.LinkH\x00\x12&\n\x05array\x18\x04 \x01(\x0b2\x15.edgir.elem.LinkArrayH\x00B\x06\n\x04typeb\x06proto3') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "edgir.elem_pb2", globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'edgir.elem_pb2', globals()) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None _HIERARCHYBLOCK_PARAMDEFAULTSENTRY._options = None - _HIERARCHYBLOCK_PARAMDEFAULTSENTRY._serialized_options = b"8\x01" + _HIERARCHYBLOCK_PARAMDEFAULTSENTRY._serialized_options = b'8\x01' _NAMEDVALINIT._serialized_start = 105 _NAMEDVALINIT._serialized_end = 169 _NAMEDVALUEEXPR._serialized_start = 171 @@ -57,4 +52,4 @@ _LINKARRAY._serialized_start = 2891 _LINKARRAY._serialized_end = 3117 _LINKLIKE._serialized_start = 3120 - _LINKLIKE._serialized_end = 3298 + _LINKLIKE._serialized_end = 3298 \ No newline at end of file diff --git a/edg/edgir/elem_pb2.pyi b/edg/edgir/elem_pb2.pyi index 4922395ee..9c09803fc 100644 --- a/edg/edgir/elem_pb2.pyi +++ b/edg/edgir/elem_pb2.pyi @@ -13,7 +13,6 @@ We don't strictly differentiate between library elements and elements within a design within the protobuf. In general, when there is a library element, we """ - from collections import abc as _abc from edgir import common_pb2 as _common_pb2 from edgir import expr_pb2 as _expr_pb2 @@ -25,7 +24,6 @@ from google.protobuf.internal import containers as _containers import builtins as _builtins import sys import typing as _typing - if sys.version_info >= (3, 10): from typing import TypeAlias as _TypeAlias else: @@ -38,22 +36,25 @@ class NamedValInit(_message.Message): are unordered (whereas we want to preserve ordering to preserve design intent through the compiler), we use a sequence of these pairs. """ - DESCRIPTOR: _descriptor.Descriptor NAME_FIELD_NUMBER: _builtins.int VALUE_FIELD_NUMBER: _builtins.int name: _builtins.str @_builtins.property - def value(self) -> _init_pb2.ValInit: ... - def __init__(self, *, name: _builtins.str = ..., value: _init_pb2.ValInit | None = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["value", b"value"] + def value(self) -> _init_pb2.ValInit: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["name", b"name", "value", b"value"] + def __init__(self, *, name: _builtins.str=..., value: _init_pb2.ValInit | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['value', b'value'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['name', b'name', 'value', b'value'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___NamedValInit: _TypeAlias = NamedValInit @_typing.final @@ -64,15 +65,19 @@ class NamedValueExpr(_message.Message): name: _builtins.str @_builtins.property - def value(self) -> _expr_pb2.ValueExpr: ... - def __init__(self, *, name: _builtins.str = ..., value: _expr_pb2.ValueExpr | None = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["value", b"value"] + def value(self) -> _expr_pb2.ValueExpr: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["name", b"name", "value", b"value"] + def __init__(self, *, name: _builtins.str=..., value: _expr_pb2.ValueExpr | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['value', b'value'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['name', b'name', 'value', b'value'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___NamedValueExpr: _TypeAlias = NamedValueExpr @_typing.final @@ -83,15 +88,19 @@ class NamedPortLike(_message.Message): name: _builtins.str @_builtins.property - def value(self) -> Global___PortLike: ... - def __init__(self, *, name: _builtins.str = ..., value: Global___PortLike | None = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["value", b"value"] + def value(self) -> Global___PortLike: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["name", b"name", "value", b"value"] + def __init__(self, *, name: _builtins.str=..., value: Global___PortLike | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['value', b'value'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['name', b'name', 'value', b'value'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___NamedPortLike: _TypeAlias = NamedPortLike @_typing.final @@ -102,15 +111,19 @@ class NamedBlockLike(_message.Message): name: _builtins.str @_builtins.property - def value(self) -> Global___BlockLike: ... - def __init__(self, *, name: _builtins.str = ..., value: Global___BlockLike | None = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["value", b"value"] + def value(self) -> Global___BlockLike: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["name", b"name", "value", b"value"] + def __init__(self, *, name: _builtins.str=..., value: Global___BlockLike | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['value', b'value'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['name', b'name', 'value', b'value'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___NamedBlockLike: _TypeAlias = NamedBlockLike @_typing.final @@ -121,15 +134,19 @@ class NamedLinkLike(_message.Message): name: _builtins.str @_builtins.property - def value(self) -> Global___LinkLike: ... - def __init__(self, *, name: _builtins.str = ..., value: Global___LinkLike | None = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["value", b"value"] + def value(self) -> Global___LinkLike: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["name", b"name", "value", b"value"] + def __init__(self, *, name: _builtins.str=..., value: Global___LinkLike | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['value', b'value'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['name', b'name', 'value', b'value'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___NamedLinkLike: _TypeAlias = NamedLinkLike @_typing.final @@ -144,13 +161,21 @@ class Port(_message.Message): META_FIELD_NUMBER: _builtins.int @_builtins.property - def params(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedValInit]: ... + def params(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedValInit]: + ... + @_builtins.property - def constraints(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedValueExpr]: ... + def constraints(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedValueExpr]: + ... + @_builtins.property - def ports(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedPortLike]: ... + def ports(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedPortLike]: + ... + @_builtins.property - def self_class(self) -> _ref_pb2.LibraryPath: ... + def self_class(self) -> _ref_pb2.LibraryPath: + ... + @_builtins.property def superclasses(self) -> _containers.RepeatedCompositeFieldContainer[_ref_pb2.LibraryPath]: """superclasses, may be empty""" @@ -163,39 +188,16 @@ class Port(_message.Message): def meta(self) -> _common_pb2.Metadata: """TODO: this provides type hierarchy data only, inheritance semantics are currently undefined""" - def __init__( - self, - *, - params: _abc.Iterable[Global___NamedValInit] | None = ..., - constraints: _abc.Iterable[Global___NamedValueExpr] | None = ..., - ports: _abc.Iterable[Global___NamedPortLike] | None = ..., - self_class: _ref_pb2.LibraryPath | None = ..., - superclasses: _abc.Iterable[_ref_pb2.LibraryPath] | None = ..., - super_superclasses: _abc.Iterable[_ref_pb2.LibraryPath] | None = ..., - meta: _common_pb2.Metadata | None = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta", "self_class", b"self_class"] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "constraints", - b"constraints", - "meta", - b"meta", - "params", - b"params", - "ports", - b"ports", - "self_class", - b"self_class", - "super_superclasses", - b"super_superclasses", - "superclasses", - b"superclasses", - ] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def __init__(self, *, params: _abc.Iterable[Global___NamedValInit] | None=..., constraints: _abc.Iterable[Global___NamedValueExpr] | None=..., ports: _abc.Iterable[Global___NamedPortLike] | None=..., self_class: _ref_pb2.LibraryPath | None=..., superclasses: _abc.Iterable[_ref_pb2.LibraryPath] | None=..., super_superclasses: _abc.Iterable[_ref_pb2.LibraryPath] | None=..., meta: _common_pb2.Metadata | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta', 'self_class', b'self_class'] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['constraints', b'constraints', 'meta', b'meta', 'params', b'params', 'ports', b'ports', 'self_class', b'self_class', 'super_superclasses', b'super_superclasses', 'superclasses', b'superclasses'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___Port: _TypeAlias = Port @_typing.final @@ -208,12 +210,15 @@ class PortArray(_message.Message): PORTS_FIELD_NUMBER: _builtins.int @_builtins.property - def ports(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedPortLike]: ... - def __init__(self, *, ports: _abc.Iterable[Global___NamedPortLike] | None = ...) -> None: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["ports", b"ports"] + def ports(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedPortLike]: + ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def __init__(self, *, ports: _abc.Iterable[Global___NamedPortLike] | None=...) -> None: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['ports', b'ports'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... SELF_CLASS_FIELD_NUMBER: _builtins.int PORTS_FIELD_NUMBER: _builtins.int META_FIELD_NUMBER: _builtins.int @@ -225,37 +230,33 @@ class PortArray(_message.Message): """ @_builtins.property - def ports(self) -> Global___PortArray.Ports: ... + def ports(self) -> Global___PortArray.Ports: + ... + @_builtins.property - def meta(self) -> _common_pb2.Metadata: ... - def __init__( - self, - *, - self_class: _ref_pb2.LibraryPath | None = ..., - ports: Global___PortArray.Ports | None = ..., - meta: _common_pb2.Metadata | None = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal[ - "contains", b"contains", "meta", b"meta", "ports", b"ports", "self_class", b"self_class" - ] + def meta(self) -> _common_pb2.Metadata: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "contains", b"contains", "meta", b"meta", "ports", b"ports", "self_class", b"self_class" - ] + def __init__(self, *, self_class: _ref_pb2.LibraryPath | None=..., ports: Global___PortArray.Ports | None=..., meta: _common_pb2.Metadata | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['contains', b'contains', 'meta', b'meta', 'ports', b'ports', 'self_class', b'self_class'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - _WhichOneofReturnType_contains: _TypeAlias = _typing.Literal["ports"] - _WhichOneofArgType_contains: _TypeAlias = _typing.Literal["contains", b"contains"] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['contains', b'contains', 'meta', b'meta', 'ports', b'ports', 'self_class', b'self_class'] - def WhichOneof(self, oneof_group: _WhichOneofArgType_contains) -> _WhichOneofReturnType_contains | None: ... + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... + _WhichOneofReturnType_contains: _TypeAlias = _typing.Literal['ports'] + _WhichOneofArgType_contains: _TypeAlias = _typing.Literal['contains', b'contains'] + def WhichOneof(self, oneof_group: _WhichOneofArgType_contains) -> _WhichOneofReturnType_contains | None: + ... Global___PortArray: _TypeAlias = PortArray @_typing.final class PortLike(_message.Message): """* Wrapper for different port like elements""" - DESCRIPTOR: _descriptor.Descriptor UNDEFINED_FIELD_NUMBER: _builtins.int LIB_ELEM_FIELD_NUMBER: _builtins.int @@ -263,38 +264,36 @@ class PortLike(_message.Message): ARRAY_FIELD_NUMBER: _builtins.int @_builtins.property - def undefined(self) -> _common_pb2.Empty: ... + def undefined(self) -> _common_pb2.Empty: + ... + @_builtins.property - def lib_elem(self) -> _ref_pb2.LibraryPath: ... + def lib_elem(self) -> _ref_pb2.LibraryPath: + ... + @_builtins.property def port(self) -> Global___Port: """* 'port' disallowed w/in the library""" @_builtins.property - def array(self) -> Global___PortArray: ... - def __init__( - self, - *, - undefined: _common_pb2.Empty | None = ..., - lib_elem: _ref_pb2.LibraryPath | None = ..., - port: Global___Port | None = ..., - array: Global___PortArray | None = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal[ - "array", b"array", "is", b"is", "lib_elem", b"lib_elem", "port", b"port", "undefined", b"undefined" - ] + def array(self) -> Global___PortArray: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "array", b"array", "is", b"is", "lib_elem", b"lib_elem", "port", b"port", "undefined", b"undefined" - ] + def __init__(self, *, undefined: _common_pb2.Empty | None=..., lib_elem: _ref_pb2.LibraryPath | None=..., port: Global___Port | None=..., array: Global___PortArray | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['array', b'array', 'is', b'is', 'lib_elem', b'lib_elem', 'port', b'port', 'undefined', b'undefined'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - _WhichOneofReturnType_is: _TypeAlias = _typing.Literal["undefined", "lib_elem", "port", "array"] - _WhichOneofArgType_is: _TypeAlias = _typing.Literal["is", b"is"] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['array', b'array', 'is', b'is', 'lib_elem', b'lib_elem', 'port', b'port', 'undefined', b'undefined'] - def WhichOneof(self, oneof_group: _WhichOneofArgType_is) -> _WhichOneofReturnType_is | None: ... + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... + _WhichOneofReturnType_is: _TypeAlias = _typing.Literal['undefined', 'lib_elem', 'port', 'array'] + _WhichOneofArgType_is: _TypeAlias = _typing.Literal['is', b'is'] + def WhichOneof(self, oneof_group: _WhichOneofArgType_is) -> _WhichOneofReturnType_is | None: + ... Global___PortLike: _TypeAlias = PortLike @_typing.final @@ -305,15 +304,19 @@ class Parameter(_message.Message): unit: _builtins.str @_builtins.property - def path(self) -> _ref_pb2.LocalPath: ... - def __init__(self, *, path: _ref_pb2.LocalPath | None = ..., unit: _builtins.str = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["path", b"path"] + def path(self) -> _ref_pb2.LocalPath: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["path", b"path", "unit", b"unit"] + def __init__(self, *, path: _ref_pb2.LocalPath | None=..., unit: _builtins.str=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['path', b'path'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['path', b'path', 'unit', b'unit'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___Parameter: _TypeAlias = Parameter @_typing.final @@ -324,19 +327,24 @@ class StringDescriptionElement(_message.Message): text: _builtins.str @_builtins.property - def param(self) -> Global___Parameter: ... - def __init__(self, *, text: _builtins.str = ..., param: Global___Parameter | None = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["ElementType", b"ElementType", "param", b"param", "text", b"text"] + def param(self) -> Global___Parameter: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["ElementType", b"ElementType", "param", b"param", "text", b"text"] + def __init__(self, *, text: _builtins.str=..., param: Global___Parameter | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['ElementType', b'ElementType', 'param', b'param', 'text', b'text'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - _WhichOneofReturnType_ElementType: _TypeAlias = _typing.Literal["text", "param"] - _WhichOneofArgType_ElementType: _TypeAlias = _typing.Literal["ElementType", b"ElementType"] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['ElementType', b'ElementType', 'param', b'param', 'text', b'text'] - def WhichOneof(self, oneof_group: _WhichOneofArgType_ElementType) -> _WhichOneofReturnType_ElementType | None: ... + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... + _WhichOneofReturnType_ElementType: _TypeAlias = _typing.Literal['text', 'param'] + _WhichOneofArgType_ElementType: _TypeAlias = _typing.Literal['ElementType', b'ElementType'] + def WhichOneof(self, oneof_group: _WhichOneofArgType_ElementType) -> _WhichOneofReturnType_ElementType | None: + ... Global___StringDescriptionElement: _TypeAlias = StringDescriptionElement @_typing.final @@ -351,15 +359,19 @@ class HierarchyBlock(_message.Message): key: _builtins.str @_builtins.property - def value(self) -> _expr_pb2.ValueExpr: ... - def __init__(self, *, key: _builtins.str = ..., value: _expr_pb2.ValueExpr | None = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["value", b"value"] + def value(self) -> _expr_pb2.ValueExpr: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["key", b"key", "value", b"value"] + def __init__(self, *, key: _builtins.str=..., value: _expr_pb2.ValueExpr | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['value', b'value'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['key', b'key', 'value', b'value'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... PARAMS_FIELD_NUMBER: _builtins.int PARAM_DEFAULTS_FIELD_NUMBER: _builtins.int PORTS_FIELD_NUMBER: _builtins.int @@ -377,10 +389,12 @@ class HierarchyBlock(_message.Message): META_FIELD_NUMBER: _builtins.int DESCRIPTION_FIELD_NUMBER: _builtins.int is_abstract: _builtins.bool - "true if self_class is abstract, and should error if used in a design" + 'true if self_class is abstract, and should error if used in a design' @_builtins.property - def params(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedValInit]: ... + def params(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedValInit]: + ... + @_builtins.property def param_defaults(self) -> _containers.MessageMap[_builtins.str, _expr_pb2.ValueExpr]: """Refinements may introduce new parameters which would not be assigned a value in the parent class. @@ -389,7 +403,9 @@ class HierarchyBlock(_message.Message): """ @_builtins.property - def ports(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedPortLike]: ... + def ports(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedPortLike]: + ... + @_builtins.property def blocks(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedBlockLike]: """* Bridges, which adapt an edge port to a link port - eg, edge VoltageSink to an internal link @@ -398,7 +414,9 @@ class HierarchyBlock(_message.Message): """ @_builtins.property - def links(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedLinkLike]: ... + def links(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedLinkLike]: + ... + @_builtins.property def constraints(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedValueExpr]: """* Connections between internal block and link ports are represented by connected constraints. @@ -434,80 +452,23 @@ class HierarchyBlock(_message.Message): """optional default refinement subclass, only valid for library blocks""" @_builtins.property - def meta(self) -> _common_pb2.Metadata: ... - @_builtins.property - def description(self) -> _containers.RepeatedCompositeFieldContainer[Global___StringDescriptionElement]: ... - def __init__( - self, - *, - params: _abc.Iterable[Global___NamedValInit] | None = ..., - param_defaults: _abc.Mapping[_builtins.str, _expr_pb2.ValueExpr] | None = ..., - ports: _abc.Iterable[Global___NamedPortLike] | None = ..., - blocks: _abc.Iterable[Global___NamedBlockLike] | None = ..., - links: _abc.Iterable[Global___NamedLinkLike] | None = ..., - constraints: _abc.Iterable[Global___NamedValueExpr] | None = ..., - self_class: _ref_pb2.LibraryPath | None = ..., - superclasses: _abc.Iterable[_ref_pb2.LibraryPath] | None = ..., - super_superclasses: _abc.Iterable[_ref_pb2.LibraryPath] | None = ..., - prerefine_class: _ref_pb2.LibraryPath | None = ..., - prerefine_mixins: _abc.Iterable[_ref_pb2.LibraryPath] | None = ..., - generator: Global___Generator | None = ..., - is_abstract: _builtins.bool = ..., - default_refinement: _ref_pb2.LibraryPath | None = ..., - meta: _common_pb2.Metadata | None = ..., - description: _abc.Iterable[Global___StringDescriptionElement] | None = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal[ - "default_refinement", - b"default_refinement", - "generator", - b"generator", - "meta", - b"meta", - "prerefine_class", - b"prerefine_class", - "self_class", - b"self_class", - ] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "blocks", - b"blocks", - "constraints", - b"constraints", - "default_refinement", - b"default_refinement", - "description", - b"description", - "generator", - b"generator", - "is_abstract", - b"is_abstract", - "links", - b"links", - "meta", - b"meta", - "param_defaults", - b"param_defaults", - "params", - b"params", - "ports", - b"ports", - "prerefine_class", - b"prerefine_class", - "prerefine_mixins", - b"prerefine_mixins", - "self_class", - b"self_class", - "super_superclasses", - b"super_superclasses", - "superclasses", - b"superclasses", - ] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def meta(self) -> _common_pb2.Metadata: + ... + + @_builtins.property + def description(self) -> _containers.RepeatedCompositeFieldContainer[Global___StringDescriptionElement]: + ... + + def __init__(self, *, params: _abc.Iterable[Global___NamedValInit] | None=..., param_defaults: _abc.Mapping[_builtins.str, _expr_pb2.ValueExpr] | None=..., ports: _abc.Iterable[Global___NamedPortLike] | None=..., blocks: _abc.Iterable[Global___NamedBlockLike] | None=..., links: _abc.Iterable[Global___NamedLinkLike] | None=..., constraints: _abc.Iterable[Global___NamedValueExpr] | None=..., self_class: _ref_pb2.LibraryPath | None=..., superclasses: _abc.Iterable[_ref_pb2.LibraryPath] | None=..., super_superclasses: _abc.Iterable[_ref_pb2.LibraryPath] | None=..., prerefine_class: _ref_pb2.LibraryPath | None=..., prerefine_mixins: _abc.Iterable[_ref_pb2.LibraryPath] | None=..., generator: Global___Generator | None=..., is_abstract: _builtins.bool=..., default_refinement: _ref_pb2.LibraryPath | None=..., meta: _common_pb2.Metadata | None=..., description: _abc.Iterable[Global___StringDescriptionElement] | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['default_refinement', b'default_refinement', 'generator', b'generator', 'meta', b'meta', 'prerefine_class', b'prerefine_class', 'self_class', b'self_class'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['blocks', b'blocks', 'constraints', b'constraints', 'default_refinement', b'default_refinement', 'description', b'description', 'generator', b'generator', 'is_abstract', b'is_abstract', 'links', b'links', 'meta', b'meta', 'param_defaults', b'param_defaults', 'params', b'params', 'ports', b'ports', 'prerefine_class', b'prerefine_class', 'prerefine_mixins', b'prerefine_mixins', 'self_class', b'self_class', 'super_superclasses', b'super_superclasses', 'superclasses', b'superclasses'] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___HierarchyBlock: _TypeAlias = HierarchyBlock @_typing.final @@ -521,11 +482,12 @@ class Generator(_message.Message): These parameters are the only ones accessible to the generator. """ - def __init__(self, *, required_params: _abc.Iterable[_ref_pb2.LocalPath] | None = ...) -> None: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["required_params", b"required_params"] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def __init__(self, *, required_params: _abc.Iterable[_ref_pb2.LocalPath] | None=...) -> None: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['required_params', b'required_params'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___Generator: _TypeAlias = Generator @_typing.final @@ -535,19 +497,23 @@ class BlockLibrary(_message.Message): MIXINS_FIELD_NUMBER: _builtins.int @_builtins.property - def base(self) -> _ref_pb2.LibraryPath: ... + def base(self) -> _ref_pb2.LibraryPath: + ... + @_builtins.property - def mixins(self) -> _containers.RepeatedCompositeFieldContainer[_ref_pb2.LibraryPath]: ... - def __init__( - self, *, base: _ref_pb2.LibraryPath | None = ..., mixins: _abc.Iterable[_ref_pb2.LibraryPath] | None = ... - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["base", b"base"] + def mixins(self) -> _containers.RepeatedCompositeFieldContainer[_ref_pb2.LibraryPath]: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["base", b"base", "mixins", b"mixins"] + def __init__(self, *, base: _ref_pb2.LibraryPath | None=..., mixins: _abc.Iterable[_ref_pb2.LibraryPath] | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['base', b'base'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['base', b'base', 'mixins', b'mixins'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___BlockLibrary: _TypeAlias = BlockLibrary @_typing.final @@ -558,35 +524,32 @@ class BlockLike(_message.Message): HIERARCHY_FIELD_NUMBER: _builtins.int @_builtins.property - def undefined(self) -> _common_pb2.Empty: ... + def undefined(self) -> _common_pb2.Empty: + ... + @_builtins.property - def lib_elem(self) -> Global___BlockLibrary: ... + def lib_elem(self) -> Global___BlockLibrary: + ... + @_builtins.property def hierarchy(self) -> Global___HierarchyBlock: """* not allowed w/in the library""" - def __init__( - self, - *, - undefined: _common_pb2.Empty | None = ..., - lib_elem: Global___BlockLibrary | None = ..., - hierarchy: Global___HierarchyBlock | None = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal[ - "hierarchy", b"hierarchy", "lib_elem", b"lib_elem", "type", b"type", "undefined", b"undefined" - ] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "hierarchy", b"hierarchy", "lib_elem", b"lib_elem", "type", b"type", "undefined", b"undefined" - ] + def __init__(self, *, undefined: _common_pb2.Empty | None=..., lib_elem: Global___BlockLibrary | None=..., hierarchy: Global___HierarchyBlock | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['hierarchy', b'hierarchy', 'lib_elem', b'lib_elem', 'type', b'type', 'undefined', b'undefined'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - _WhichOneofReturnType_type: _TypeAlias = _typing.Literal["undefined", "lib_elem", "hierarchy"] - _WhichOneofArgType_type: _TypeAlias = _typing.Literal["type", b"type"] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['hierarchy', b'hierarchy', 'lib_elem', b'lib_elem', 'type', b'type', 'undefined', b'undefined'] - def WhichOneof(self, oneof_group: _WhichOneofArgType_type) -> _WhichOneofReturnType_type | None: ... + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... + _WhichOneofReturnType_type: _TypeAlias = _typing.Literal['undefined', 'lib_elem', 'hierarchy'] + _WhichOneofArgType_type: _TypeAlias = _typing.Literal['type', b'type'] + def WhichOneof(self, oneof_group: _WhichOneofArgType_type) -> _WhichOneofReturnType_type | None: + ... Global___BlockLike: _TypeAlias = BlockLike @_typing.final @@ -603,15 +566,25 @@ class Link(_message.Message): DESCRIPTION_FIELD_NUMBER: _builtins.int @_builtins.property - def params(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedValInit]: ... + def params(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedValInit]: + ... + @_builtins.property - def ports(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedPortLike]: ... + def ports(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedPortLike]: + ... + @_builtins.property - def links(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedLinkLike]: ... + def links(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedLinkLike]: + ... + @_builtins.property - def constraints(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedValueExpr]: ... + def constraints(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedValueExpr]: + ... + @_builtins.property - def self_class(self) -> _ref_pb2.LibraryPath: ... + def self_class(self) -> _ref_pb2.LibraryPath: + ... + @_builtins.property def superclasses(self) -> _containers.RepeatedCompositeFieldContainer[_ref_pb2.LibraryPath]: """superclasses, may be empty""" @@ -625,46 +598,19 @@ class Link(_message.Message): """TODO: this provides type hierarchy data only, inheritance semantics are currently undefined""" @_builtins.property - def description(self) -> _containers.RepeatedCompositeFieldContainer[Global___StringDescriptionElement]: ... - def __init__( - self, - *, - params: _abc.Iterable[Global___NamedValInit] | None = ..., - ports: _abc.Iterable[Global___NamedPortLike] | None = ..., - links: _abc.Iterable[Global___NamedLinkLike] | None = ..., - constraints: _abc.Iterable[Global___NamedValueExpr] | None = ..., - self_class: _ref_pb2.LibraryPath | None = ..., - superclasses: _abc.Iterable[_ref_pb2.LibraryPath] | None = ..., - super_superclasses: _abc.Iterable[_ref_pb2.LibraryPath] | None = ..., - meta: _common_pb2.Metadata | None = ..., - description: _abc.Iterable[Global___StringDescriptionElement] | None = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta", "self_class", b"self_class"] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "constraints", - b"constraints", - "description", - b"description", - "links", - b"links", - "meta", - b"meta", - "params", - b"params", - "ports", - b"ports", - "self_class", - b"self_class", - "super_superclasses", - b"super_superclasses", - "superclasses", - b"superclasses", - ] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def description(self) -> _containers.RepeatedCompositeFieldContainer[Global___StringDescriptionElement]: + ... + + def __init__(self, *, params: _abc.Iterable[Global___NamedValInit] | None=..., ports: _abc.Iterable[Global___NamedPortLike] | None=..., links: _abc.Iterable[Global___NamedLinkLike] | None=..., constraints: _abc.Iterable[Global___NamedValueExpr] | None=..., self_class: _ref_pb2.LibraryPath | None=..., superclasses: _abc.Iterable[_ref_pb2.LibraryPath] | None=..., super_superclasses: _abc.Iterable[_ref_pb2.LibraryPath] | None=..., meta: _common_pb2.Metadata | None=..., description: _abc.Iterable[Global___StringDescriptionElement] | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta', 'self_class', b'self_class'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['constraints', b'constraints', 'description', b'description', 'links', b'links', 'meta', b'meta', 'params', b'params', 'ports', b'ports', 'self_class', b'self_class', 'super_superclasses', b'super_superclasses', 'superclasses', b'superclasses'] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___Link: _TypeAlias = Link @_typing.final @@ -693,36 +639,23 @@ class LinkArray(_message.Message): """includes all exported constraints to map link ports to my ports""" @_builtins.property - def links(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedLinkLike]: ... - @_builtins.property - def meta(self) -> _common_pb2.Metadata: ... - def __init__( - self, - *, - self_class: _ref_pb2.LibraryPath | None = ..., - ports: _abc.Iterable[Global___NamedPortLike] | None = ..., - constraints: _abc.Iterable[Global___NamedValueExpr] | None = ..., - links: _abc.Iterable[Global___NamedLinkLike] | None = ..., - meta: _common_pb2.Metadata | None = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta", "self_class", b"self_class"] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "constraints", - b"constraints", - "links", - b"links", - "meta", - b"meta", - "ports", - b"ports", - "self_class", - b"self_class", - ] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def links(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedLinkLike]: + ... + @_builtins.property + def meta(self) -> _common_pb2.Metadata: + ... + + def __init__(self, *, self_class: _ref_pb2.LibraryPath | None=..., ports: _abc.Iterable[Global___NamedPortLike] | None=..., constraints: _abc.Iterable[Global___NamedValueExpr] | None=..., links: _abc.Iterable[Global___NamedLinkLike] | None=..., meta: _common_pb2.Metadata | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta', 'self_class', b'self_class'] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['constraints', b'constraints', 'links', b'links', 'meta', b'meta', 'ports', b'ports', 'self_class', b'self_class'] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___LinkArray: _TypeAlias = LinkArray @_typing.final @@ -734,36 +667,34 @@ class LinkLike(_message.Message): ARRAY_FIELD_NUMBER: _builtins.int @_builtins.property - def undefined(self) -> _common_pb2.Empty: ... + def undefined(self) -> _common_pb2.Empty: + ... + @_builtins.property - def lib_elem(self) -> _ref_pb2.LibraryPath: ... + def lib_elem(self) -> _ref_pb2.LibraryPath: + ... + @_builtins.property def link(self) -> Global___Link: """* not allowed w/in the library""" @_builtins.property - def array(self) -> Global___LinkArray: ... - def __init__( - self, - *, - undefined: _common_pb2.Empty | None = ..., - lib_elem: _ref_pb2.LibraryPath | None = ..., - link: Global___Link | None = ..., - array: Global___LinkArray | None = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal[ - "array", b"array", "lib_elem", b"lib_elem", "link", b"link", "type", b"type", "undefined", b"undefined" - ] + def array(self) -> Global___LinkArray: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "array", b"array", "lib_elem", b"lib_elem", "link", b"link", "type", b"type", "undefined", b"undefined" - ] + def __init__(self, *, undefined: _common_pb2.Empty | None=..., lib_elem: _ref_pb2.LibraryPath | None=..., link: Global___Link | None=..., array: Global___LinkArray | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['array', b'array', 'lib_elem', b'lib_elem', 'link', b'link', 'type', b'type', 'undefined', b'undefined'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - _WhichOneofReturnType_type: _TypeAlias = _typing.Literal["undefined", "lib_elem", "link", "array"] - _WhichOneofArgType_type: _TypeAlias = _typing.Literal["type", b"type"] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['array', b'array', 'lib_elem', b'lib_elem', 'link', b'link', 'type', b'type', 'undefined', b'undefined'] - def WhichOneof(self, oneof_group: _WhichOneofArgType_type) -> _WhichOneofReturnType_type | None: ... + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... + _WhichOneofReturnType_type: _TypeAlias = _typing.Literal['undefined', 'lib_elem', 'link', 'array'] + _WhichOneofArgType_type: _TypeAlias = _typing.Literal['type', b'type'] -Global___LinkLike: _TypeAlias = LinkLike + def WhichOneof(self, oneof_group: _WhichOneofArgType_type) -> _WhichOneofReturnType_type | None: + ... +Global___LinkLike: _TypeAlias = LinkLike \ No newline at end of file diff --git a/edg/edgir/expr_pb2.py b/edg/edgir/expr_pb2.py index 9bc92c74b..db1910d84 100644 --- a/edg/edgir/expr_pb2.py +++ b/edg/edgir/expr_pb2.py @@ -1,24 +1,19 @@ """Generated protocol buffer code.""" - from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database - _sym_db = _symbol_database.Default() from ..edgir import ref_pb2 as edgir_dot_ref__pb2 from ..edgir import common_pb2 as edgir_dot_common__pb2 from ..edgir import lit_pb2 as edgir_dot_lit__pb2 - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\x10edgir/expr.proto\x12\nedgir.expr\x1a\x0fedgir/ref.proto\x1a\x12edgir/common.proto\x1a\x0fedgir/lit.proto"\xb4\x01\n\tUnaryExpr\x12$\n\x02op\x18\x01 \x01(\x0e2\x18.edgir.expr.UnaryExpr.Op\x12"\n\x03val\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr"]\n\x02Op\x12\r\n\tUNDEFINED\x10\x00\x12\n\n\x06NEGATE\x10\x01\x12\x07\n\x03NOT\x10\x02\x12\n\n\x06INVERT\x10\x03\x12\x07\n\x03MIN\x10\x04\x12\x07\n\x03MAX\x10\x05\x12\n\n\x06CENTER\x10\x06\x12\t\n\x05WIDTH\x10\x07"\x9f\x02\n\x0cUnarySetExpr\x12\'\n\x02op\x18\x01 \x01(\x0e2\x1b.edgir.expr.UnarySetExpr.Op\x12#\n\x04vals\x18\x04 \x01(\x0b2\x15.edgir.expr.ValueExpr"\xc0\x01\n\x02Op\x12\r\n\tUNDEFINED\x10\x00\x12\x07\n\x03SUM\x10\x01\x12\x0c\n\x08ALL_TRUE\x10\x02\x12\x0c\n\x08ANY_TRUE\x10\x03\x12\n\n\x06ALL_EQ\x10\x04\x12\x0e\n\nALL_UNIQUE\x10\x05\x12\x0b\n\x07MAXIMUM\x10\n\x12\x0b\n\x07MINIMUM\x10\x0b\x12\x0f\n\x0bSET_EXTRACT\x10\x0c\x12\x10\n\x0cINTERSECTION\x10\r\x12\x08\n\x04HULL\x10\x0e\x12\n\n\x06NEGATE\x10\x14\x12\n\n\x06INVERT\x10\x15\x12\x0b\n\x07FLATTEN\x10\x1e"\xd4\x02\n\nBinaryExpr\x12%\n\x02op\x18\x01 \x01(\x0e2\x19.edgir.expr.BinaryExpr.Op\x12"\n\x03lhs\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12"\n\x03rhs\x18\x03 \x01(\x0b2\x15.edgir.expr.ValueExpr"\xd6\x01\n\x02Op\x12\r\n\tUNDEFINED\x10\x00\x12\x07\n\x03ADD\x10\n\x12\x08\n\x04MULT\x10\x0c\x12\x0f\n\x0bSHRINK_MULT\x107\x12\x07\n\x03AND\x10\x14\x12\x06\n\x02OR\x10\x15\x12\x07\n\x03XOR\x10\x16\x12\x0b\n\x07IMPLIES\x10\x17\x12\x06\n\x02EQ\x10\x1e\x12\x07\n\x03NEQ\x10\x1f\x12\x06\n\x02GT\x10(\x12\x07\n\x03GTE\x10)\x12\x06\n\x02LT\x10*\x12\x07\n\x03LTE\x10,\x12\x07\n\x03MAX\x10-\x12\x07\n\x03MIN\x10.\x12\x10\n\x0cINTERSECTION\x103\x12\x08\n\x04HULL\x106\x12\n\n\x06WITHIN\x105\x12\t\n\x05RANGE\x10\x01"\xbf\x01\n\rBinarySetExpr\x12(\n\x02op\x18\x01 \x01(\x0e2\x1c.edgir.expr.BinarySetExpr.Op\x12$\n\x05lhset\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12"\n\x03rhs\x18\x03 \x01(\x0b2\x15.edgir.expr.ValueExpr":\n\x02Op\x12\r\n\tUNDEFINED\x10\x00\x12\x07\n\x03ADD\x10\n\x12\x08\n\x04MULT\x10\x0c\x12\n\n\x06CONCAT\x10\x14\x12\x06\n\x02EQ\x10\x1e"0\n\tArrayExpr\x12#\n\x04vals\x18\x01 \x03(\x0b2\x15.edgir.expr.ValueExpr"[\n\tRangeExpr\x12&\n\x07minimum\x18\x01 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12&\n\x07maximum\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr"\x80\x01\n\nStructExpr\x12.\n\x04vals\x18\x01 \x03(\x0b2 .edgir.expr.StructExpr.ValsEntry\x1aB\n\tValsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr:\x028\x01"\xa3\x01\n\x0eIfThenElseExpr\x12#\n\x04cond\x18\x01 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12"\n\x03tru\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12"\n\x03fal\x18\x03 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata"]\n\x0bExtractExpr\x12(\n\tcontainer\x18\x01 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12$\n\x05index\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr"^\n\x0eMapExtractExpr\x12(\n\tcontainer\x18\x01 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12"\n\x04path\x18\x02 \x01(\x0b2\x14.edgir.ref.LocalPath"\x91\x01\n\rConnectedExpr\x12)\n\nblock_port\x18\x01 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12(\n\tlink_port\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12+\n\x08expanded\x18\x03 \x03(\x0b2\x19.edgir.expr.ConnectedExpr"\x9c\x01\n\x0cExportedExpr\x12,\n\rexterior_port\x18\x01 \x01(\x0b2\x15.edgir.expr.ValueExpr\x122\n\x13internal_block_port\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12*\n\x08expanded\x18\x03 \x03(\x0b2\x18.edgir.expr.ExportedExpr"S\n\nAssignExpr\x12!\n\x03dst\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12"\n\x03src\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr"\x97\x07\n\tValueExpr\x12&\n\x07literal\x18\x01 \x01(\x0b2\x13.edgir.lit.ValueLitH\x00\x12(\n\x06binary\x18\x02 \x01(\x0b2\x16.edgir.expr.BinaryExprH\x00\x12/\n\nbinary_set\x18\x12 \x01(\x0b2\x19.edgir.expr.BinarySetExprH\x00\x12&\n\x05unary\x18\x03 \x01(\x0b2\x15.edgir.expr.UnaryExprH\x00\x12-\n\tunary_set\x18\x04 \x01(\x0b2\x18.edgir.expr.UnarySetExprH\x00\x12&\n\x05array\x18\x06 \x01(\x0b2\x15.edgir.expr.ArrayExprH\x00\x12(\n\x06struct\x18\x07 \x01(\x0b2\x16.edgir.expr.StructExprH\x00\x12&\n\x05range\x18\x08 \x01(\x0b2\x15.edgir.expr.RangeExprH\x00\x120\n\nifThenElse\x18\n \x01(\x0b2\x1a.edgir.expr.IfThenElseExprH\x00\x12*\n\x07extract\x18\x0c \x01(\x0b2\x17.edgir.expr.ExtractExprH\x00\x121\n\x0bmap_extract\x18\x0e \x01(\x0b2\x1a.edgir.expr.MapExtractExprH\x00\x12.\n\tconnected\x18\x0f \x01(\x0b2\x19.edgir.expr.ConnectedExprH\x00\x12,\n\x08exported\x18\x10 \x01(\x0b2\x18.edgir.expr.ExportedExprH\x00\x123\n\x0econnectedArray\x18\x13 \x01(\x0b2\x19.edgir.expr.ConnectedExprH\x00\x121\n\rexportedArray\x18\x14 \x01(\x0b2\x18.edgir.expr.ExportedExprH\x00\x12(\n\x06assign\x18\x11 \x01(\x0b2\x16.edgir.expr.AssignExprH\x00\x122\n\x0eexportedTunnel\x18\x15 \x01(\x0b2\x18.edgir.expr.ExportedExprH\x00\x12.\n\x0cassignTunnel\x18\x16 \x01(\x0b2\x16.edgir.expr.AssignExprH\x00\x12#\n\x03ref\x18c \x01(\x0b2\x14.edgir.ref.LocalPathH\x00\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.MetadataB\x06\n\x04exprb\x06proto3' -) +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10edgir/expr.proto\x12\nedgir.expr\x1a\x0fedgir/ref.proto\x1a\x12edgir/common.proto\x1a\x0fedgir/lit.proto"\xb4\x01\n\tUnaryExpr\x12$\n\x02op\x18\x01 \x01(\x0e2\x18.edgir.expr.UnaryExpr.Op\x12"\n\x03val\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr"]\n\x02Op\x12\r\n\tUNDEFINED\x10\x00\x12\n\n\x06NEGATE\x10\x01\x12\x07\n\x03NOT\x10\x02\x12\n\n\x06INVERT\x10\x03\x12\x07\n\x03MIN\x10\x04\x12\x07\n\x03MAX\x10\x05\x12\n\n\x06CENTER\x10\x06\x12\t\n\x05WIDTH\x10\x07"\x9f\x02\n\x0cUnarySetExpr\x12\'\n\x02op\x18\x01 \x01(\x0e2\x1b.edgir.expr.UnarySetExpr.Op\x12#\n\x04vals\x18\x04 \x01(\x0b2\x15.edgir.expr.ValueExpr"\xc0\x01\n\x02Op\x12\r\n\tUNDEFINED\x10\x00\x12\x07\n\x03SUM\x10\x01\x12\x0c\n\x08ALL_TRUE\x10\x02\x12\x0c\n\x08ANY_TRUE\x10\x03\x12\n\n\x06ALL_EQ\x10\x04\x12\x0e\n\nALL_UNIQUE\x10\x05\x12\x0b\n\x07MAXIMUM\x10\n\x12\x0b\n\x07MINIMUM\x10\x0b\x12\x0f\n\x0bSET_EXTRACT\x10\x0c\x12\x10\n\x0cINTERSECTION\x10\r\x12\x08\n\x04HULL\x10\x0e\x12\n\n\x06NEGATE\x10\x14\x12\n\n\x06INVERT\x10\x15\x12\x0b\n\x07FLATTEN\x10\x1e"\xd4\x02\n\nBinaryExpr\x12%\n\x02op\x18\x01 \x01(\x0e2\x19.edgir.expr.BinaryExpr.Op\x12"\n\x03lhs\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12"\n\x03rhs\x18\x03 \x01(\x0b2\x15.edgir.expr.ValueExpr"\xd6\x01\n\x02Op\x12\r\n\tUNDEFINED\x10\x00\x12\x07\n\x03ADD\x10\n\x12\x08\n\x04MULT\x10\x0c\x12\x0f\n\x0bSHRINK_MULT\x107\x12\x07\n\x03AND\x10\x14\x12\x06\n\x02OR\x10\x15\x12\x07\n\x03XOR\x10\x16\x12\x0b\n\x07IMPLIES\x10\x17\x12\x06\n\x02EQ\x10\x1e\x12\x07\n\x03NEQ\x10\x1f\x12\x06\n\x02GT\x10(\x12\x07\n\x03GTE\x10)\x12\x06\n\x02LT\x10*\x12\x07\n\x03LTE\x10,\x12\x07\n\x03MAX\x10-\x12\x07\n\x03MIN\x10.\x12\x10\n\x0cINTERSECTION\x103\x12\x08\n\x04HULL\x106\x12\n\n\x06WITHIN\x105\x12\t\n\x05RANGE\x10\x01"\xbf\x01\n\rBinarySetExpr\x12(\n\x02op\x18\x01 \x01(\x0e2\x1c.edgir.expr.BinarySetExpr.Op\x12$\n\x05lhset\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12"\n\x03rhs\x18\x03 \x01(\x0b2\x15.edgir.expr.ValueExpr":\n\x02Op\x12\r\n\tUNDEFINED\x10\x00\x12\x07\n\x03ADD\x10\n\x12\x08\n\x04MULT\x10\x0c\x12\n\n\x06CONCAT\x10\x14\x12\x06\n\x02EQ\x10\x1e"0\n\tArrayExpr\x12#\n\x04vals\x18\x01 \x03(\x0b2\x15.edgir.expr.ValueExpr"[\n\tRangeExpr\x12&\n\x07minimum\x18\x01 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12&\n\x07maximum\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr"\x80\x01\n\nStructExpr\x12.\n\x04vals\x18\x01 \x03(\x0b2 .edgir.expr.StructExpr.ValsEntry\x1aB\n\tValsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr:\x028\x01"\xa3\x01\n\x0eIfThenElseExpr\x12#\n\x04cond\x18\x01 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12"\n\x03tru\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12"\n\x03fal\x18\x03 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata"]\n\x0bExtractExpr\x12(\n\tcontainer\x18\x01 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12$\n\x05index\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr"^\n\x0eMapExtractExpr\x12(\n\tcontainer\x18\x01 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12"\n\x04path\x18\x02 \x01(\x0b2\x14.edgir.ref.LocalPath"\x91\x01\n\rConnectedExpr\x12)\n\nblock_port\x18\x01 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12(\n\tlink_port\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12+\n\x08expanded\x18\x03 \x03(\x0b2\x19.edgir.expr.ConnectedExpr"\x9c\x01\n\x0cExportedExpr\x12,\n\rexterior_port\x18\x01 \x01(\x0b2\x15.edgir.expr.ValueExpr\x122\n\x13internal_block_port\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12*\n\x08expanded\x18\x03 \x03(\x0b2\x18.edgir.expr.ExportedExpr"S\n\nAssignExpr\x12!\n\x03dst\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12"\n\x03src\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr"\x97\x07\n\tValueExpr\x12&\n\x07literal\x18\x01 \x01(\x0b2\x13.edgir.lit.ValueLitH\x00\x12(\n\x06binary\x18\x02 \x01(\x0b2\x16.edgir.expr.BinaryExprH\x00\x12/\n\nbinary_set\x18\x12 \x01(\x0b2\x19.edgir.expr.BinarySetExprH\x00\x12&\n\x05unary\x18\x03 \x01(\x0b2\x15.edgir.expr.UnaryExprH\x00\x12-\n\tunary_set\x18\x04 \x01(\x0b2\x18.edgir.expr.UnarySetExprH\x00\x12&\n\x05array\x18\x06 \x01(\x0b2\x15.edgir.expr.ArrayExprH\x00\x12(\n\x06struct\x18\x07 \x01(\x0b2\x16.edgir.expr.StructExprH\x00\x12&\n\x05range\x18\x08 \x01(\x0b2\x15.edgir.expr.RangeExprH\x00\x120\n\nifThenElse\x18\n \x01(\x0b2\x1a.edgir.expr.IfThenElseExprH\x00\x12*\n\x07extract\x18\x0c \x01(\x0b2\x17.edgir.expr.ExtractExprH\x00\x121\n\x0bmap_extract\x18\x0e \x01(\x0b2\x1a.edgir.expr.MapExtractExprH\x00\x12.\n\tconnected\x18\x0f \x01(\x0b2\x19.edgir.expr.ConnectedExprH\x00\x12,\n\x08exported\x18\x10 \x01(\x0b2\x18.edgir.expr.ExportedExprH\x00\x123\n\x0econnectedArray\x18\x13 \x01(\x0b2\x19.edgir.expr.ConnectedExprH\x00\x121\n\rexportedArray\x18\x14 \x01(\x0b2\x18.edgir.expr.ExportedExprH\x00\x12(\n\x06assign\x18\x11 \x01(\x0b2\x16.edgir.expr.AssignExprH\x00\x122\n\x0eexportedTunnel\x18\x15 \x01(\x0b2\x18.edgir.expr.ExportedExprH\x00\x12.\n\x0cassignTunnel\x18\x16 \x01(\x0b2\x16.edgir.expr.AssignExprH\x00\x12#\n\x03ref\x18c \x01(\x0b2\x14.edgir.ref.LocalPathH\x00\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.MetadataB\x06\n\x04exprb\x06proto3') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "edgir.expr_pb2", globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'edgir.expr_pb2', globals()) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None _STRUCTEXPR_VALSENTRY._options = None - _STRUCTEXPR_VALSENTRY._serialized_options = b"8\x01" + _STRUCTEXPR_VALSENTRY._serialized_options = b'8\x01' _UNARYEXPR._serialized_start = 87 _UNARYEXPR._serialized_end = 267 _UNARYEXPR_OP._serialized_start = 174 @@ -56,4 +51,4 @@ _ASSIGNEXPR._serialized_start = 2034 _ASSIGNEXPR._serialized_end = 2117 _VALUEEXPR._serialized_start = 2120 - _VALUEEXPR._serialized_end = 3039 + _VALUEEXPR._serialized_end = 3039 \ No newline at end of file diff --git a/edg/edgir/expr_pb2.pyi b/edg/edgir/expr_pb2.pyi index 5ef2e0b8f..2d1e15315 100644 --- a/edg/edgir/expr_pb2.pyi +++ b/edg/edgir/expr_pb2.pyi @@ -25,7 +25,6 @@ in a small number number of places to help classify types into groups. I don't think we should be using sorts at all in this module, but it's defined for the sake on completeness. """ - from collections import abc as _abc from edgir import common_pb2 as _common_pb2 from edgir import lit_pb2 as _lit_pb2 @@ -37,7 +36,6 @@ from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper import builtins as _builtins import sys import typing as _typing - if sys.version_info >= (3, 10): from typing import TypeAlias as _TypeAlias else: @@ -49,57 +47,62 @@ class UnaryExpr(_message.Message): DESCRIPTOR: _descriptor.Descriptor class _Op: - ValueType = _typing.NewType("ValueType", _builtins.int) + ValueType = _typing.NewType('ValueType', _builtins.int) V: _TypeAlias = ValueType class _OpEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[UnaryExpr._Op.ValueType], _builtins.type): DESCRIPTOR: _descriptor.EnumDescriptor UNDEFINED: UnaryExpr._Op.ValueType NEGATE: UnaryExpr._Op.ValueType - "* Negate :: Numeric a => a -> a\n :: Numeric a => Range a -> Range a\n " + '* Negate :: Numeric a => a -> a\n :: Numeric a => Range a -> Range a\n ' NOT: UnaryExpr._Op.ValueType - "* Not :: Bool -> Bool" + '* Not :: Bool -> Bool' INVERT: UnaryExpr._Op.ValueType - "* Invert :: Float -> Float\n :: Range Float -> Range Float\n " + '* Invert :: Float -> Float\n :: Range Float -> Range Float\n ' MIN: UnaryExpr._Op.ValueType - "* Min :: Range a -> a" + '* Min :: Range a -> a' MAX: UnaryExpr._Op.ValueType - "* Max :: Range a -> a" + '* Max :: Range a -> a' CENTER: UnaryExpr._Op.ValueType - "* Center :: Range a -> a" + '* Center :: Range a -> a' WIDTH: UnaryExpr._Op.ValueType - "* Width :: Range a -> a" + '* Width :: Range a -> a' - class Op(_Op, metaclass=_OpEnumTypeWrapper): ... + class Op(_Op, metaclass=_OpEnumTypeWrapper): + ... UNDEFINED: UnaryExpr.Op.ValueType NEGATE: UnaryExpr.Op.ValueType - "* Negate :: Numeric a => a -> a\n :: Numeric a => Range a -> Range a\n " + '* Negate :: Numeric a => a -> a\n :: Numeric a => Range a -> Range a\n ' NOT: UnaryExpr.Op.ValueType - "* Not :: Bool -> Bool" + '* Not :: Bool -> Bool' INVERT: UnaryExpr.Op.ValueType - "* Invert :: Float -> Float\n :: Range Float -> Range Float\n " + '* Invert :: Float -> Float\n :: Range Float -> Range Float\n ' MIN: UnaryExpr.Op.ValueType - "* Min :: Range a -> a" + '* Min :: Range a -> a' MAX: UnaryExpr.Op.ValueType - "* Max :: Range a -> a" + '* Max :: Range a -> a' CENTER: UnaryExpr.Op.ValueType - "* Center :: Range a -> a" + '* Center :: Range a -> a' WIDTH: UnaryExpr.Op.ValueType - "* Width :: Range a -> a" + '* Width :: Range a -> a' OP_FIELD_NUMBER: _builtins.int VAL_FIELD_NUMBER: _builtins.int op: Global___UnaryExpr.Op.ValueType @_builtins.property - def val(self) -> Global___ValueExpr: ... - def __init__(self, *, op: Global___UnaryExpr.Op.ValueType = ..., val: Global___ValueExpr | None = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["val", b"val"] + def val(self) -> Global___ValueExpr: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["op", b"op", "val", b"val"] + def __init__(self, *, op: Global___UnaryExpr.Op.ValueType=..., val: Global___ValueExpr | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['val', b'val'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['op', b'op', 'val', b'val'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___UnaryExpr: _TypeAlias = UnaryExpr @_typing.final @@ -107,83 +110,86 @@ class UnarySetExpr(_message.Message): DESCRIPTOR: _descriptor.Descriptor class _Op: - ValueType = _typing.NewType("ValueType", _builtins.int) + ValueType = _typing.NewType('ValueType', _builtins.int) V: _TypeAlias = ValueType class _OpEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[UnarySetExpr._Op.ValueType], _builtins.type): DESCRIPTOR: _descriptor.EnumDescriptor UNDEFINED: UnarySetExpr._Op.ValueType SUM: UnarySetExpr._Op.ValueType - "* Sum :: (Numeric a) => Set a -> a\n :: (Numeric a) => Set (Range a) -> Range a\n\n Sum({}) = 0\n " + '* Sum :: (Numeric a) => Set a -> a\n :: (Numeric a) => Set (Range a) -> Range a\n\n Sum({}) = 0\n ' ALL_TRUE: UnarySetExpr._Op.ValueType - "* All :: Set Bool -> Bool\n\n All inputs are true\n All({}) = True\n " + '* All :: Set Bool -> Bool\n\n All inputs are true\n All({}) = True\n ' ANY_TRUE: UnarySetExpr._Op.ValueType - "* Any :: Set Bool -> Bool\n\n Any of the inputs are true\n Any({}) = False\n " + '* Any :: Set Bool -> Bool\n\n Any of the inputs are true\n Any({}) = False\n ' ALL_EQ: UnarySetExpr._Op.ValueType - "* AllEq :: (Equality a) => Set a -> Bool\n\n AllEq({}) = True\n " + '* AllEq :: (Equality a) => Set a -> Bool\n\n AllEq({}) = True\n ' ALL_UNIQUE: UnarySetExpr._Op.ValueType - "* AllUnique :: (Equality a) => Set a -> Bool\n\n AllUnique(EmptySet) = True\n " + '* AllUnique :: (Equality a) => Set a -> Bool\n\n AllUnique(EmptySet) = True\n ' MAXIMUM: UnarySetExpr._Op.ValueType - "SIZE = 6;\n\n * Maximum :: (Ordered a) => Set a -> a\n\n This op requires that the non-emptyness of the relevant set is assured\n before being valid.\n " + 'SIZE = 6;\n\n * Maximum :: (Ordered a) => Set a -> a\n\n This op requires that the non-emptyness of the relevant set is assured\n before being valid.\n ' MINIMUM: UnarySetExpr._Op.ValueType - "* Minimum :: (Ordered a) => Set a -> a\n\n This op requires that the non-emptyness of the relevant set is assured\n before being valid.\n " + '* Minimum :: (Ordered a) => Set a -> a\n\n This op requires that the non-emptyness of the relevant set is assured\n before being valid.\n ' SET_EXTRACT: UnarySetExpr._Op.ValueType - "* SetExtract :: Set a -> a\n\n This op requires that the non-emptyness of the relevant set is assured\n before being valid. In addition this assumes all values in the set are equal.\n " + '* SetExtract :: Set a -> a\n\n This op requires that the non-emptyness of the relevant set is assured\n before being valid. In addition this assumes all values in the set are equal.\n ' INTERSECTION: UnarySetExpr._Op.ValueType - "* Intersection :: Set (Range a) -> Range a\n\n May produce an empty range.\n Intersection({}) = [-inf, +inf]\n " + '* Intersection :: Set (Range a) -> Range a\n\n May produce an empty range.\n Intersection({}) = [-inf, +inf]\n ' HULL: UnarySetExpr._Op.ValueType - "* Hull :: Set (Range a) -> Range a\n Returns the convex hull (union with all the inner missing bits filled in)\n Hull({}) = EmptyRange\n " + '* Hull :: Set (Range a) -> Range a\n Returns the convex hull (union with all the inner missing bits filled in)\n Hull({}) = EmptyRange\n ' NEGATE: UnarySetExpr._Op.ValueType - "* Negate :: Numeric a => Set a -> Set a\n :: Numeric a => Set (Range a) -> Set (Range a)\n\n Pointwise negate\n " + '* Negate :: Numeric a => Set a -> Set a\n :: Numeric a => Set (Range a) -> Set (Range a)\n\n Pointwise negate\n ' INVERT: UnarySetExpr._Op.ValueType - "* Invert :: Set Float -> Set Float\n :: Set (Range Float) -> Set (Range Float)\n\n Pointwise Invert\n " + '* Invert :: Set Float -> Set Float\n :: Set (Range Float) -> Set (Range Float)\n\n Pointwise Invert\n ' FLATTEN: UnarySetExpr._Op.ValueType - "Flatten[A] : Set[Set[A]] -> Set[A]\n Given an array of array of elements, flattens the inner array.\n Alternatively stated, concatenates all of the elements of the outer arrary\n " + 'Flatten[A] : Set[Set[A]] -> Set[A]\n Given an array of array of elements, flattens the inner array.\n Alternatively stated, concatenates all of the elements of the outer arrary\n ' - class Op(_Op, metaclass=_OpEnumTypeWrapper): ... + class Op(_Op, metaclass=_OpEnumTypeWrapper): + ... UNDEFINED: UnarySetExpr.Op.ValueType SUM: UnarySetExpr.Op.ValueType - "* Sum :: (Numeric a) => Set a -> a\n :: (Numeric a) => Set (Range a) -> Range a\n\n Sum({}) = 0\n " + '* Sum :: (Numeric a) => Set a -> a\n :: (Numeric a) => Set (Range a) -> Range a\n\n Sum({}) = 0\n ' ALL_TRUE: UnarySetExpr.Op.ValueType - "* All :: Set Bool -> Bool\n\n All inputs are true\n All({}) = True\n " + '* All :: Set Bool -> Bool\n\n All inputs are true\n All({}) = True\n ' ANY_TRUE: UnarySetExpr.Op.ValueType - "* Any :: Set Bool -> Bool\n\n Any of the inputs are true\n Any({}) = False\n " + '* Any :: Set Bool -> Bool\n\n Any of the inputs are true\n Any({}) = False\n ' ALL_EQ: UnarySetExpr.Op.ValueType - "* AllEq :: (Equality a) => Set a -> Bool\n\n AllEq({}) = True\n " + '* AllEq :: (Equality a) => Set a -> Bool\n\n AllEq({}) = True\n ' ALL_UNIQUE: UnarySetExpr.Op.ValueType - "* AllUnique :: (Equality a) => Set a -> Bool\n\n AllUnique(EmptySet) = True\n " + '* AllUnique :: (Equality a) => Set a -> Bool\n\n AllUnique(EmptySet) = True\n ' MAXIMUM: UnarySetExpr.Op.ValueType - "SIZE = 6;\n\n * Maximum :: (Ordered a) => Set a -> a\n\n This op requires that the non-emptyness of the relevant set is assured\n before being valid.\n " + 'SIZE = 6;\n\n * Maximum :: (Ordered a) => Set a -> a\n\n This op requires that the non-emptyness of the relevant set is assured\n before being valid.\n ' MINIMUM: UnarySetExpr.Op.ValueType - "* Minimum :: (Ordered a) => Set a -> a\n\n This op requires that the non-emptyness of the relevant set is assured\n before being valid.\n " + '* Minimum :: (Ordered a) => Set a -> a\n\n This op requires that the non-emptyness of the relevant set is assured\n before being valid.\n ' SET_EXTRACT: UnarySetExpr.Op.ValueType - "* SetExtract :: Set a -> a\n\n This op requires that the non-emptyness of the relevant set is assured\n before being valid. In addition this assumes all values in the set are equal.\n " + '* SetExtract :: Set a -> a\n\n This op requires that the non-emptyness of the relevant set is assured\n before being valid. In addition this assumes all values in the set are equal.\n ' INTERSECTION: UnarySetExpr.Op.ValueType - "* Intersection :: Set (Range a) -> Range a\n\n May produce an empty range.\n Intersection({}) = [-inf, +inf]\n " + '* Intersection :: Set (Range a) -> Range a\n\n May produce an empty range.\n Intersection({}) = [-inf, +inf]\n ' HULL: UnarySetExpr.Op.ValueType - "* Hull :: Set (Range a) -> Range a\n Returns the convex hull (union with all the inner missing bits filled in)\n Hull({}) = EmptyRange\n " + '* Hull :: Set (Range a) -> Range a\n Returns the convex hull (union with all the inner missing bits filled in)\n Hull({}) = EmptyRange\n ' NEGATE: UnarySetExpr.Op.ValueType - "* Negate :: Numeric a => Set a -> Set a\n :: Numeric a => Set (Range a) -> Set (Range a)\n\n Pointwise negate\n " + '* Negate :: Numeric a => Set a -> Set a\n :: Numeric a => Set (Range a) -> Set (Range a)\n\n Pointwise negate\n ' INVERT: UnarySetExpr.Op.ValueType - "* Invert :: Set Float -> Set Float\n :: Set (Range Float) -> Set (Range Float)\n\n Pointwise Invert\n " + '* Invert :: Set Float -> Set Float\n :: Set (Range Float) -> Set (Range Float)\n\n Pointwise Invert\n ' FLATTEN: UnarySetExpr.Op.ValueType - "Flatten[A] : Set[Set[A]] -> Set[A]\n Given an array of array of elements, flattens the inner array.\n Alternatively stated, concatenates all of the elements of the outer arrary\n " + 'Flatten[A] : Set[Set[A]] -> Set[A]\n Given an array of array of elements, flattens the inner array.\n Alternatively stated, concatenates all of the elements of the outer arrary\n ' OP_FIELD_NUMBER: _builtins.int VALS_FIELD_NUMBER: _builtins.int op: Global___UnarySetExpr.Op.ValueType @_builtins.property - def vals(self) -> Global___ValueExpr: ... - def __init__( - self, *, op: Global___UnarySetExpr.Op.ValueType = ..., vals: Global___ValueExpr | None = ... - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["vals", b"vals"] + def vals(self) -> Global___ValueExpr: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["op", b"op", "vals", b"vals"] + def __init__(self, *, op: Global___UnarySetExpr.Op.ValueType=..., vals: Global___ValueExpr | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['vals', b'vals'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['op', b'op', 'vals', b'vals'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___UnarySetExpr: _TypeAlias = UnarySetExpr @_typing.final @@ -191,114 +197,115 @@ class BinaryExpr(_message.Message): DESCRIPTOR: _descriptor.Descriptor class _Op: - ValueType = _typing.NewType("ValueType", _builtins.int) + ValueType = _typing.NewType('ValueType', _builtins.int) V: _TypeAlias = ValueType class _OpEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[BinaryExpr._Op.ValueType], _builtins.type): DESCRIPTOR: _descriptor.EnumDescriptor UNDEFINED: BinaryExpr._Op.ValueType ADD: BinaryExpr._Op.ValueType - "* Add :: Numeric a => (lhs :: a, rhs :: a) -> a\n :: Numeric a => (lhs :: a, rhs :: Range a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: Range a) -> Range a\n " + '* Add :: Numeric a => (lhs :: a, rhs :: a) -> a\n :: Numeric a => (lhs :: a, rhs :: Range a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: Range a) -> Range a\n ' MULT: BinaryExpr._Op.ValueType - "SUB = 11; // Use ADD and NEGATE instead\n\n * Mult :: Numeric a => (lhs :: a, rhs :: a) -> a\n :: Numeric a => (lhs :: a, rhs :: Range a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: Range a) -> Range a\n " + 'SUB = 11; // Use ADD and NEGATE instead\n\n * Mult :: Numeric a => (lhs :: a, rhs :: a) -> a\n :: Numeric a => (lhs :: a, rhs :: Range a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: Range a) -> Range a\n ' SHRINK_MULT: BinaryExpr._Op.ValueType - "A shrinking multiply operation for two Range types. Not commutative.\n See the documentation for shrink_multiply in the Python core HDL code for details.\n " + 'A shrinking multiply operation for two Range types. Not commutative.\n See the documentation for shrink_multiply in the Python core HDL code for details.\n ' AND: BinaryExpr._Op.ValueType - "DIV = 13; // Use MULT and INVERT instead\n\n * And :: (lhs :: Bool, rhs :: Bool) -> Bool\n " + 'DIV = 13; // Use MULT and INVERT instead\n\n * And :: (lhs :: Bool, rhs :: Bool) -> Bool\n ' OR: BinaryExpr._Op.ValueType - "* Or :: (lhs :: Bool, rhs :: Bool) -> Bool" + '* Or :: (lhs :: Bool, rhs :: Bool) -> Bool' XOR: BinaryExpr._Op.ValueType - "* Xor :: (lhs :: Bool, rhs :: Bool) -> Bool" + '* Xor :: (lhs :: Bool, rhs :: Bool) -> Bool' IMPLIES: BinaryExpr._Op.ValueType - "* Implies :: (lhs :: Bool, rhs :: Bool) -> Bool" + '* Implies :: (lhs :: Bool, rhs :: Bool) -> Bool' EQ: BinaryExpr._Op.ValueType - "IFF = 24; // Use EQ instead\n\n * Eq :: (Equality a) => (lhs :: a, rhs :: a) -> Bool\n " + 'IFF = 24; // Use EQ instead\n\n * Eq :: (Equality a) => (lhs :: a, rhs :: a) -> Bool\n ' NEQ: BinaryExpr._Op.ValueType - "* Neq :: (Equality a) => (lhs :: a, rhs : a) -> Bool" + '* Neq :: (Equality a) => (lhs :: a, rhs : a) -> Bool' GT: BinaryExpr._Op.ValueType - "* GT :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool" + '* GT :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool' GTE: BinaryExpr._Op.ValueType - "* GTE :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool" + '* GTE :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool' LT: BinaryExpr._Op.ValueType - "* LT :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool" + '* LT :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool' LTE: BinaryExpr._Op.ValueType - "* LTE :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool" + '* LTE :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool' MAX: BinaryExpr._Op.ValueType - "* Max :: (Comparable a) => (lhs :: a, rhs :: a) -> a" + '* Max :: (Comparable a) => (lhs :: a, rhs :: a) -> a' MIN: BinaryExpr._Op.ValueType - "* Min :: (Comparable a) => (lhs :: a, rhs :: a) -> a" + '* Min :: (Comparable a) => (lhs :: a, rhs :: a) -> a' INTERSECTION: BinaryExpr._Op.ValueType - "UNION = 50;\n\n * Intersection :: (Numeric a) => (lhs : Range a, rhs : Range a) -> Range a\n " + 'UNION = 50;\n\n * Intersection :: (Numeric a) => (lhs : Range a, rhs : Range a) -> Range a\n ' HULL: BinaryExpr._Op.ValueType - "* Hull :: (lhs :: Range a, rhs :: Range a) -> Range a\n Given two input ranges, returns the convex hull (union with\n all the inner missing bits filled in)\n " + '* Hull :: (lhs :: Range a, rhs :: Range a) -> Range a\n Given two input ranges, returns the convex hull (union with\n all the inner missing bits filled in)\n ' WITHIN: BinaryExpr._Op.ValueType "INTERSECTS = 52;\n\n * Within :: (Numeric a) => (lhs :: Range a, rhs :: Range a) -> Bool\n :: (Numeric a) => (lhs :: a, rhs :: Range a) -> Bool\n\n Whether the lhs range or point is entirely within (contained by) the rhs.\n Used to be named SUBSET changed to a name that doesn't also imply a set op.\n " RANGE: BinaryExpr._Op.ValueType - "* Range :: (Comparable a) => (lower :: a, upper :: a) -> Range a" + '* Range :: (Comparable a) => (lower :: a, upper :: a) -> Range a' - class Op(_Op, metaclass=_OpEnumTypeWrapper): ... + class Op(_Op, metaclass=_OpEnumTypeWrapper): + ... UNDEFINED: BinaryExpr.Op.ValueType ADD: BinaryExpr.Op.ValueType - "* Add :: Numeric a => (lhs :: a, rhs :: a) -> a\n :: Numeric a => (lhs :: a, rhs :: Range a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: Range a) -> Range a\n " + '* Add :: Numeric a => (lhs :: a, rhs :: a) -> a\n :: Numeric a => (lhs :: a, rhs :: Range a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: Range a) -> Range a\n ' MULT: BinaryExpr.Op.ValueType - "SUB = 11; // Use ADD and NEGATE instead\n\n * Mult :: Numeric a => (lhs :: a, rhs :: a) -> a\n :: Numeric a => (lhs :: a, rhs :: Range a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: Range a) -> Range a\n " + 'SUB = 11; // Use ADD and NEGATE instead\n\n * Mult :: Numeric a => (lhs :: a, rhs :: a) -> a\n :: Numeric a => (lhs :: a, rhs :: Range a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: Range a) -> Range a\n ' SHRINK_MULT: BinaryExpr.Op.ValueType - "A shrinking multiply operation for two Range types. Not commutative.\n See the documentation for shrink_multiply in the Python core HDL code for details.\n " + 'A shrinking multiply operation for two Range types. Not commutative.\n See the documentation for shrink_multiply in the Python core HDL code for details.\n ' AND: BinaryExpr.Op.ValueType - "DIV = 13; // Use MULT and INVERT instead\n\n * And :: (lhs :: Bool, rhs :: Bool) -> Bool\n " + 'DIV = 13; // Use MULT and INVERT instead\n\n * And :: (lhs :: Bool, rhs :: Bool) -> Bool\n ' OR: BinaryExpr.Op.ValueType - "* Or :: (lhs :: Bool, rhs :: Bool) -> Bool" + '* Or :: (lhs :: Bool, rhs :: Bool) -> Bool' XOR: BinaryExpr.Op.ValueType - "* Xor :: (lhs :: Bool, rhs :: Bool) -> Bool" + '* Xor :: (lhs :: Bool, rhs :: Bool) -> Bool' IMPLIES: BinaryExpr.Op.ValueType - "* Implies :: (lhs :: Bool, rhs :: Bool) -> Bool" + '* Implies :: (lhs :: Bool, rhs :: Bool) -> Bool' EQ: BinaryExpr.Op.ValueType - "IFF = 24; // Use EQ instead\n\n * Eq :: (Equality a) => (lhs :: a, rhs :: a) -> Bool\n " + 'IFF = 24; // Use EQ instead\n\n * Eq :: (Equality a) => (lhs :: a, rhs :: a) -> Bool\n ' NEQ: BinaryExpr.Op.ValueType - "* Neq :: (Equality a) => (lhs :: a, rhs : a) -> Bool" + '* Neq :: (Equality a) => (lhs :: a, rhs : a) -> Bool' GT: BinaryExpr.Op.ValueType - "* GT :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool" + '* GT :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool' GTE: BinaryExpr.Op.ValueType - "* GTE :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool" + '* GTE :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool' LT: BinaryExpr.Op.ValueType - "* LT :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool" + '* LT :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool' LTE: BinaryExpr.Op.ValueType - "* LTE :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool" + '* LTE :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool' MAX: BinaryExpr.Op.ValueType - "* Max :: (Comparable a) => (lhs :: a, rhs :: a) -> a" + '* Max :: (Comparable a) => (lhs :: a, rhs :: a) -> a' MIN: BinaryExpr.Op.ValueType - "* Min :: (Comparable a) => (lhs :: a, rhs :: a) -> a" + '* Min :: (Comparable a) => (lhs :: a, rhs :: a) -> a' INTERSECTION: BinaryExpr.Op.ValueType - "UNION = 50;\n\n * Intersection :: (Numeric a) => (lhs : Range a, rhs : Range a) -> Range a\n " + 'UNION = 50;\n\n * Intersection :: (Numeric a) => (lhs : Range a, rhs : Range a) -> Range a\n ' HULL: BinaryExpr.Op.ValueType - "* Hull :: (lhs :: Range a, rhs :: Range a) -> Range a\n Given two input ranges, returns the convex hull (union with\n all the inner missing bits filled in)\n " + '* Hull :: (lhs :: Range a, rhs :: Range a) -> Range a\n Given two input ranges, returns the convex hull (union with\n all the inner missing bits filled in)\n ' WITHIN: BinaryExpr.Op.ValueType "INTERSECTS = 52;\n\n * Within :: (Numeric a) => (lhs :: Range a, rhs :: Range a) -> Bool\n :: (Numeric a) => (lhs :: a, rhs :: Range a) -> Bool\n\n Whether the lhs range or point is entirely within (contained by) the rhs.\n Used to be named SUBSET changed to a name that doesn't also imply a set op.\n " RANGE: BinaryExpr.Op.ValueType - "* Range :: (Comparable a) => (lower :: a, upper :: a) -> Range a" + '* Range :: (Comparable a) => (lower :: a, upper :: a) -> Range a' OP_FIELD_NUMBER: _builtins.int LHS_FIELD_NUMBER: _builtins.int RHS_FIELD_NUMBER: _builtins.int op: Global___BinaryExpr.Op.ValueType @_builtins.property - def lhs(self) -> Global___ValueExpr: ... + def lhs(self) -> Global___ValueExpr: + ... + @_builtins.property - def rhs(self) -> Global___ValueExpr: ... - def __init__( - self, - *, - op: Global___BinaryExpr.Op.ValueType = ..., - lhs: Global___ValueExpr | None = ..., - rhs: Global___ValueExpr | None = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["lhs", b"lhs", "rhs", b"rhs"] + def rhs(self) -> Global___ValueExpr: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["lhs", b"lhs", "op", b"op", "rhs", b"rhs"] + def __init__(self, *, op: Global___BinaryExpr.Op.ValueType=..., lhs: Global___ValueExpr | None=..., rhs: Global___ValueExpr | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['lhs', b'lhs', 'rhs', b'rhs'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['lhs', b'lhs', 'op', b'op', 'rhs', b'rhs'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___BinaryExpr: _TypeAlias = BinaryExpr @_typing.final @@ -306,70 +313,73 @@ class BinarySetExpr(_message.Message): DESCRIPTOR: _descriptor.Descriptor class _Op: - ValueType = _typing.NewType("ValueType", _builtins.int) + ValueType = _typing.NewType('ValueType', _builtins.int) V: _TypeAlias = ValueType class _OpEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[BinarySetExpr._Op.ValueType], _builtins.type): DESCRIPTOR: _descriptor.EnumDescriptor UNDEFINED: BinarySetExpr._Op.ValueType ADD: BinarySetExpr._Op.ValueType - "* Add :: Numeric a => (lhset : Set a, rhs : a) -> Set a\n :: Numeric a => (lhset : Set a, rhs : Range a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : Range a) -> Set (Range a)\n " + '* Add :: Numeric a => (lhset : Set a, rhs : a) -> Set a\n :: Numeric a => (lhset : Set a, rhs : Range a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : Range a) -> Set (Range a)\n ' MULT: BinarySetExpr._Op.ValueType - "* Mult :: Numeric a => (lhset : Set a, rhs : a) -> Set a\n :: Numeric a => (lhset : Set a, rhs : Range a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : Range a) -> Set (Range a)\n " + '* Mult :: Numeric a => (lhset : Set a, rhs : a) -> Set a\n :: Numeric a => (lhset : Set a, rhs : Range a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : Range a) -> Set (Range a)\n ' CONCAT: BinarySetExpr._Op.ValueType - "String concatenate operator\n Concatenate : (lhs: String, rhss: Set[String]) -> Set[String] (prepend lhs to all elements)\n : (lhss: Set[String], rhs: String) -> Set[String] (append rhs to all elements)\n " + 'String concatenate operator\n Concatenate : (lhs: String, rhss: Set[String]) -> Set[String] (prepend lhs to all elements)\n : (lhss: Set[String], rhs: String) -> Set[String] (append rhs to all elements)\n ' EQ: BinarySetExpr._Op.ValueType - "Equality operator\n (lhss: Set[A], elt: A) -> Set[Bool] (pointwise equality of all elements in the set to the element)\n " + 'Equality operator\n (lhss: Set[A], elt: A) -> Set[Bool] (pointwise equality of all elements in the set to the element)\n ' - class Op(_Op, metaclass=_OpEnumTypeWrapper): ... + class Op(_Op, metaclass=_OpEnumTypeWrapper): + ... UNDEFINED: BinarySetExpr.Op.ValueType ADD: BinarySetExpr.Op.ValueType - "* Add :: Numeric a => (lhset : Set a, rhs : a) -> Set a\n :: Numeric a => (lhset : Set a, rhs : Range a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : Range a) -> Set (Range a)\n " + '* Add :: Numeric a => (lhset : Set a, rhs : a) -> Set a\n :: Numeric a => (lhset : Set a, rhs : Range a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : Range a) -> Set (Range a)\n ' MULT: BinarySetExpr.Op.ValueType - "* Mult :: Numeric a => (lhset : Set a, rhs : a) -> Set a\n :: Numeric a => (lhset : Set a, rhs : Range a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : Range a) -> Set (Range a)\n " + '* Mult :: Numeric a => (lhset : Set a, rhs : a) -> Set a\n :: Numeric a => (lhset : Set a, rhs : Range a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : Range a) -> Set (Range a)\n ' CONCAT: BinarySetExpr.Op.ValueType - "String concatenate operator\n Concatenate : (lhs: String, rhss: Set[String]) -> Set[String] (prepend lhs to all elements)\n : (lhss: Set[String], rhs: String) -> Set[String] (append rhs to all elements)\n " + 'String concatenate operator\n Concatenate : (lhs: String, rhss: Set[String]) -> Set[String] (prepend lhs to all elements)\n : (lhss: Set[String], rhs: String) -> Set[String] (append rhs to all elements)\n ' EQ: BinarySetExpr.Op.ValueType - "Equality operator\n (lhss: Set[A], elt: A) -> Set[Bool] (pointwise equality of all elements in the set to the element)\n " + 'Equality operator\n (lhss: Set[A], elt: A) -> Set[Bool] (pointwise equality of all elements in the set to the element)\n ' OP_FIELD_NUMBER: _builtins.int LHSET_FIELD_NUMBER: _builtins.int RHS_FIELD_NUMBER: _builtins.int op: Global___BinarySetExpr.Op.ValueType @_builtins.property - def lhset(self) -> Global___ValueExpr: ... + def lhset(self) -> Global___ValueExpr: + ... + @_builtins.property - def rhs(self) -> Global___ValueExpr: ... - def __init__( - self, - *, - op: Global___BinarySetExpr.Op.ValueType = ..., - lhset: Global___ValueExpr | None = ..., - rhs: Global___ValueExpr | None = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["lhset", b"lhset", "rhs", b"rhs"] + def rhs(self) -> Global___ValueExpr: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["lhset", b"lhset", "op", b"op", "rhs", b"rhs"] + def __init__(self, *, op: Global___BinarySetExpr.Op.ValueType=..., lhset: Global___ValueExpr | None=..., rhs: Global___ValueExpr | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['lhset', b'lhset', 'rhs', b'rhs'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['lhset', b'lhset', 'op', b'op', 'rhs', b'rhs'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___BinarySetExpr: _TypeAlias = BinarySetExpr @_typing.final class ArrayExpr(_message.Message): """* Creates an array from element exprs""" - DESCRIPTOR: _descriptor.Descriptor VALS_FIELD_NUMBER: _builtins.int @_builtins.property - def vals(self) -> _containers.RepeatedCompositeFieldContainer[Global___ValueExpr]: ... - def __init__(self, *, vals: _abc.Iterable[Global___ValueExpr] | None = ...) -> None: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["vals", b"vals"] + def vals(self) -> _containers.RepeatedCompositeFieldContainer[Global___ValueExpr]: + ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def __init__(self, *, vals: _abc.Iterable[Global___ValueExpr] | None=...) -> None: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['vals', b'vals'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___ArrayExpr: _TypeAlias = ArrayExpr @_typing.final @@ -377,25 +387,28 @@ class RangeExpr(_message.Message): """* Ranges have an expression form, allowing you to constrain them without specifying them fully """ - DESCRIPTOR: _descriptor.Descriptor MINIMUM_FIELD_NUMBER: _builtins.int MAXIMUM_FIELD_NUMBER: _builtins.int @_builtins.property - def minimum(self) -> Global___ValueExpr: ... + def minimum(self) -> Global___ValueExpr: + ... + @_builtins.property - def maximum(self) -> Global___ValueExpr: ... - def __init__( - self, *, minimum: Global___ValueExpr | None = ..., maximum: Global___ValueExpr | None = ... - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["maximum", b"maximum", "minimum", b"minimum"] + def maximum(self) -> Global___ValueExpr: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["maximum", b"maximum", "minimum", b"minimum"] + def __init__(self, *, minimum: Global___ValueExpr | None=..., maximum: Global___ValueExpr | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['maximum', b'maximum', 'minimum', b'minimum'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['maximum', b'maximum', 'minimum', b'minimum'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___RangeExpr: _TypeAlias = RangeExpr @_typing.final @@ -403,7 +416,6 @@ class StructExpr(_message.Message): """* Structs have an expression form, allowing you to constrain them without specifying them fully """ - DESCRIPTOR: _descriptor.Descriptor @_typing.final @@ -414,30 +426,36 @@ class StructExpr(_message.Message): key: _builtins.str @_builtins.property - def value(self) -> Global___ValueExpr: ... - def __init__(self, *, key: _builtins.str = ..., value: Global___ValueExpr | None = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["value", b"value"] + def value(self) -> Global___ValueExpr: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["key", b"key", "value", b"value"] + def __init__(self, *, key: _builtins.str=..., value: Global___ValueExpr | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['value', b'value'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['key', b'key', 'value', b'value'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... VALS_FIELD_NUMBER: _builtins.int @_builtins.property - def vals(self) -> _containers.MessageMap[_builtins.str, Global___ValueExpr]: ... - def __init__(self, *, vals: _abc.Mapping[_builtins.str, Global___ValueExpr] | None = ...) -> None: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["vals", b"vals"] + def vals(self) -> _containers.MessageMap[_builtins.str, Global___ValueExpr]: + ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def __init__(self, *, vals: _abc.Mapping[_builtins.str, Global___ValueExpr] | None=...) -> None: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['vals', b'vals'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___StructExpr: _TypeAlias = StructExpr @_typing.final class IfThenElseExpr(_message.Message): """* IfThenElse :: (cond :: Bool, tru :: a, fal :: a) -> a""" - DESCRIPTOR: _descriptor.Descriptor COND_FIELD_NUMBER: _builtins.int TRU_FIELD_NUMBER: _builtins.int @@ -445,28 +463,31 @@ class IfThenElseExpr(_message.Message): META_FIELD_NUMBER: _builtins.int @_builtins.property - def cond(self) -> Global___ValueExpr: ... + def cond(self) -> Global___ValueExpr: + ... + @_builtins.property - def tru(self) -> Global___ValueExpr: ... + def tru(self) -> Global___ValueExpr: + ... + @_builtins.property - def fal(self) -> Global___ValueExpr: ... + def fal(self) -> Global___ValueExpr: + ... + @_builtins.property - def meta(self) -> _common_pb2.Metadata: ... - def __init__( - self, - *, - cond: Global___ValueExpr | None = ..., - tru: Global___ValueExpr | None = ..., - fal: Global___ValueExpr | None = ..., - meta: _common_pb2.Metadata | None = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["cond", b"cond", "fal", b"fal", "meta", b"meta", "tru", b"tru"] + def meta(self) -> _common_pb2.Metadata: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["cond", b"cond", "fal", b"fal", "meta", b"meta", "tru", b"tru"] + def __init__(self, *, cond: Global___ValueExpr | None=..., tru: Global___ValueExpr | None=..., fal: Global___ValueExpr | None=..., meta: _common_pb2.Metadata | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['cond', b'cond', 'fal', b'fal', 'meta', b'meta', 'tru', b'tru'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['cond', b'cond', 'fal', b'fal', 'meta', b'meta', 'tru', b'tru'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___IfThenElseExpr: _TypeAlias = IfThenElseExpr @_typing.final @@ -475,54 +496,60 @@ class ExtractExpr(_message.Message): Extract :: (container :: Struct{index :: a}, index :: string) -> a Extract :: (container :: Range a , index :: {"minimum"|"maximum"}) -> a """ - DESCRIPTOR: _descriptor.Descriptor CONTAINER_FIELD_NUMBER: _builtins.int INDEX_FIELD_NUMBER: _builtins.int @_builtins.property - def container(self) -> Global___ValueExpr: ... + def container(self) -> Global___ValueExpr: + ... + @_builtins.property - def index(self) -> Global___ValueExpr: ... - def __init__( - self, *, container: Global___ValueExpr | None = ..., index: Global___ValueExpr | None = ... - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["container", b"container", "index", b"index"] + def index(self) -> Global___ValueExpr: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["container", b"container", "index", b"index"] + def __init__(self, *, container: Global___ValueExpr | None=..., index: Global___ValueExpr | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['container', b'container', 'index', b'index'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['container', b'container', 'index', b'index'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___ExtractExpr: _TypeAlias = ExtractExpr @_typing.final class MapExtractExpr(_message.Message): """/** MapExtract :: (container :: Array a , path :: LocalRef{from :: a, to :: b}) -> Array b - MapExtract :: (container :: Set a , path :: LocalRef{from :: a, to :: b}) -> Set b + MapExtract :: (container :: Set a , path :: LocalRef{from :: a, to :: b}) -> Set b - This expression can map over a container and return a container of - the relevant subexpression determined by a path. */ + This expression can map over a container and return a container of + the relevant subexpression determined by a path. */ """ - DESCRIPTOR: _descriptor.Descriptor CONTAINER_FIELD_NUMBER: _builtins.int PATH_FIELD_NUMBER: _builtins.int @_builtins.property - def container(self) -> Global___ValueExpr: ... + def container(self) -> Global___ValueExpr: + ... + @_builtins.property - def path(self) -> _ref_pb2.LocalPath: ... - def __init__( - self, *, container: Global___ValueExpr | None = ..., path: _ref_pb2.LocalPath | None = ... - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["container", b"container", "path", b"path"] + def path(self) -> _ref_pb2.LocalPath: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["container", b"container", "path", b"path"] + def __init__(self, *, container: Global___ValueExpr | None=..., path: _ref_pb2.LocalPath | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['container', b'container', 'path', b'path'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['container', b'container', 'path', b'path'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___MapExtractExpr: _TypeAlias = MapExtractExpr @_typing.final @@ -531,16 +558,19 @@ class ConnectedExpr(_message.Message): This tells us whether the specified ports are connected """ - DESCRIPTOR: _descriptor.Descriptor BLOCK_PORT_FIELD_NUMBER: _builtins.int LINK_PORT_FIELD_NUMBER: _builtins.int EXPANDED_FIELD_NUMBER: _builtins.int @_builtins.property - def block_port(self) -> Global___ValueExpr: ... + def block_port(self) -> Global___ValueExpr: + ... + @_builtins.property - def link_port(self) -> Global___ValueExpr: ... + def link_port(self) -> Global___ValueExpr: + ... + @_builtins.property def expanded(self) -> _containers.RepeatedCompositeFieldContainer[Global___ConnectedExpr]: """During compilation, ConnectedExpr may be expanded (allocate replaced with concrete path indices, @@ -549,22 +579,16 @@ class ConnectedExpr(_message.Message): while the original (parent) is not modified. """ - def __init__( - self, - *, - block_port: Global___ValueExpr | None = ..., - link_port: Global___ValueExpr | None = ..., - expanded: _abc.Iterable[Global___ConnectedExpr] | None = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["block_port", b"block_port", "link_port", b"link_port"] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "block_port", b"block_port", "expanded", b"expanded", "link_port", b"link_port" - ] + def __init__(self, *, block_port: Global___ValueExpr | None=..., link_port: Global___ValueExpr | None=..., expanded: _abc.Iterable[Global___ConnectedExpr] | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['block_port', b'block_port', 'link_port', b'link_port'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['block_port', b'block_port', 'expanded', b'expanded', 'link_port', b'link_port'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___ConnectedExpr: _TypeAlias = ConnectedExpr @_typing.final @@ -573,38 +597,33 @@ class ExportedExpr(_message.Message): This tells us whether the specified port is exported to the hierarchy block exterior port """ - DESCRIPTOR: _descriptor.Descriptor EXTERIOR_PORT_FIELD_NUMBER: _builtins.int INTERNAL_BLOCK_PORT_FIELD_NUMBER: _builtins.int EXPANDED_FIELD_NUMBER: _builtins.int @_builtins.property - def exterior_port(self) -> Global___ValueExpr: ... + def exterior_port(self) -> Global___ValueExpr: + ... + @_builtins.property - def internal_block_port(self) -> Global___ValueExpr: ... + def internal_block_port(self) -> Global___ValueExpr: + ... + @_builtins.property def expanded(self) -> _containers.RepeatedCompositeFieldContainer[Global___ExportedExpr]: """see comment in ConnectedExpr""" - def __init__( - self, - *, - exterior_port: Global___ValueExpr | None = ..., - internal_block_port: Global___ValueExpr | None = ..., - expanded: _abc.Iterable[Global___ExportedExpr] | None = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal[ - "exterior_port", b"exterior_port", "internal_block_port", b"internal_block_port" - ] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "expanded", b"expanded", "exterior_port", b"exterior_port", "internal_block_port", b"internal_block_port" - ] + def __init__(self, *, exterior_port: Global___ValueExpr | None=..., internal_block_port: Global___ValueExpr | None=..., expanded: _abc.Iterable[Global___ExportedExpr] | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['exterior_port', b'exterior_port', 'internal_block_port', b'internal_block_port'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['expanded', b'expanded', 'exterior_port', b'exterior_port', 'internal_block_port', b'internal_block_port'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___ExportedExpr: _TypeAlias = ExportedExpr @_typing.final @@ -612,23 +631,28 @@ class AssignExpr(_message.Message): """Variable assignment (from an expression value), which allows dataflow to be directioned and explicit. Assignments should not be cyclic. """ - DESCRIPTOR: _descriptor.Descriptor DST_FIELD_NUMBER: _builtins.int SRC_FIELD_NUMBER: _builtins.int @_builtins.property - def dst(self) -> _ref_pb2.LocalPath: ... + def dst(self) -> _ref_pb2.LocalPath: + ... + @_builtins.property - def src(self) -> Global___ValueExpr: ... - def __init__(self, *, dst: _ref_pb2.LocalPath | None = ..., src: Global___ValueExpr | None = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["dst", b"dst", "src", b"src"] + def src(self) -> Global___ValueExpr: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["dst", b"dst", "src", b"src"] + def __init__(self, *, dst: _ref_pb2.LocalPath | None=..., src: Global___ValueExpr | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['dst', b'dst', 'src', b'src'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['dst', b'dst', 'src', b'src'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___AssignExpr: _TypeAlias = AssignExpr @_typing.final @@ -656,29 +680,49 @@ class ValueExpr(_message.Message): META_FIELD_NUMBER: _builtins.int @_builtins.property - def literal(self) -> _lit_pb2.ValueLit: ... + def literal(self) -> _lit_pb2.ValueLit: + ... + @_builtins.property - def binary(self) -> Global___BinaryExpr: ... + def binary(self) -> Global___BinaryExpr: + ... + @_builtins.property - def binary_set(self) -> Global___BinarySetExpr: ... + def binary_set(self) -> Global___BinarySetExpr: + ... + @_builtins.property - def unary(self) -> Global___UnaryExpr: ... + def unary(self) -> Global___UnaryExpr: + ... + @_builtins.property - def unary_set(self) -> Global___UnarySetExpr: ... + def unary_set(self) -> Global___UnarySetExpr: + ... + @_builtins.property def array(self) -> Global___ArrayExpr: """SetExpr set = 5;""" @_builtins.property - def struct(self) -> Global___StructExpr: ... + def struct(self) -> Global___StructExpr: + ... + @_builtins.property - def range(self) -> Global___RangeExpr: ... + def range(self) -> Global___RangeExpr: + ... + @_builtins.property - def ifThenElse(self) -> Global___IfThenElseExpr: ... + def ifThenElse(self) -> Global___IfThenElseExpr: + ... + @_builtins.property - def extract(self) -> Global___ExtractExpr: ... + def extract(self) -> Global___ExtractExpr: + ... + @_builtins.property - def map_extract(self) -> Global___MapExtractExpr: ... + def map_extract(self) -> Global___MapExtractExpr: + ... + @_builtins.property def connected(self) -> Global___ConnectedExpr: """single port to single port connect""" @@ -696,7 +740,9 @@ class ValueExpr(_message.Message): """array to array export, where allocate means allocate a subarray""" @_builtins.property - def assign(self) -> Global___AssignExpr: ... + def assign(self) -> Global___AssignExpr: + ... + @_builtins.property def exportedTunnel(self) -> Global___ExportedExpr: """These Exprs support cross-hierarchy operations @@ -718,148 +764,26 @@ class ValueExpr(_message.Message): """ @_builtins.property - def ref(self) -> _ref_pb2.LocalPath: ... - @_builtins.property - def meta(self) -> _common_pb2.Metadata: ... - def __init__( - self, - *, - literal: _lit_pb2.ValueLit | None = ..., - binary: Global___BinaryExpr | None = ..., - binary_set: Global___BinarySetExpr | None = ..., - unary: Global___UnaryExpr | None = ..., - unary_set: Global___UnarySetExpr | None = ..., - array: Global___ArrayExpr | None = ..., - struct: Global___StructExpr | None = ..., - range: Global___RangeExpr | None = ..., - ifThenElse: Global___IfThenElseExpr | None = ..., - extract: Global___ExtractExpr | None = ..., - map_extract: Global___MapExtractExpr | None = ..., - connected: Global___ConnectedExpr | None = ..., - exported: Global___ExportedExpr | None = ..., - connectedArray: Global___ConnectedExpr | None = ..., - exportedArray: Global___ExportedExpr | None = ..., - assign: Global___AssignExpr | None = ..., - exportedTunnel: Global___ExportedExpr | None = ..., - assignTunnel: Global___AssignExpr | None = ..., - ref: _ref_pb2.LocalPath | None = ..., - meta: _common_pb2.Metadata | None = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal[ - "array", - b"array", - "assign", - b"assign", - "assignTunnel", - b"assignTunnel", - "binary", - b"binary", - "binary_set", - b"binary_set", - "connected", - b"connected", - "connectedArray", - b"connectedArray", - "exported", - b"exported", - "exportedArray", - b"exportedArray", - "exportedTunnel", - b"exportedTunnel", - "expr", - b"expr", - "extract", - b"extract", - "ifThenElse", - b"ifThenElse", - "literal", - b"literal", - "map_extract", - b"map_extract", - "meta", - b"meta", - "range", - b"range", - "ref", - b"ref", - "struct", - b"struct", - "unary", - b"unary", - "unary_set", - b"unary_set", - ] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "array", - b"array", - "assign", - b"assign", - "assignTunnel", - b"assignTunnel", - "binary", - b"binary", - "binary_set", - b"binary_set", - "connected", - b"connected", - "connectedArray", - b"connectedArray", - "exported", - b"exported", - "exportedArray", - b"exportedArray", - "exportedTunnel", - b"exportedTunnel", - "expr", - b"expr", - "extract", - b"extract", - "ifThenElse", - b"ifThenElse", - "literal", - b"literal", - "map_extract", - b"map_extract", - "meta", - b"meta", - "range", - b"range", - "ref", - b"ref", - "struct", - b"struct", - "unary", - b"unary", - "unary_set", - b"unary_set", - ] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - _WhichOneofReturnType_expr: _TypeAlias = _typing.Literal[ - "literal", - "binary", - "binary_set", - "unary", - "unary_set", - "array", - "struct", - "range", - "ifThenElse", - "extract", - "map_extract", - "connected", - "exported", - "connectedArray", - "exportedArray", - "assign", - "exportedTunnel", - "assignTunnel", - "ref", - ] - _WhichOneofArgType_expr: _TypeAlias = _typing.Literal["expr", b"expr"] - - def WhichOneof(self, oneof_group: _WhichOneofArgType_expr) -> _WhichOneofReturnType_expr | None: ... - -Global___ValueExpr: _TypeAlias = ValueExpr + def ref(self) -> _ref_pb2.LocalPath: + ... + + @_builtins.property + def meta(self) -> _common_pb2.Metadata: + ... + + def __init__(self, *, literal: _lit_pb2.ValueLit | None=..., binary: Global___BinaryExpr | None=..., binary_set: Global___BinarySetExpr | None=..., unary: Global___UnaryExpr | None=..., unary_set: Global___UnarySetExpr | None=..., array: Global___ArrayExpr | None=..., struct: Global___StructExpr | None=..., range: Global___RangeExpr | None=..., ifThenElse: Global___IfThenElseExpr | None=..., extract: Global___ExtractExpr | None=..., map_extract: Global___MapExtractExpr | None=..., connected: Global___ConnectedExpr | None=..., exported: Global___ExportedExpr | None=..., connectedArray: Global___ConnectedExpr | None=..., exportedArray: Global___ExportedExpr | None=..., assign: Global___AssignExpr | None=..., exportedTunnel: Global___ExportedExpr | None=..., assignTunnel: Global___AssignExpr | None=..., ref: _ref_pb2.LocalPath | None=..., meta: _common_pb2.Metadata | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['array', b'array', 'assign', b'assign', 'assignTunnel', b'assignTunnel', 'binary', b'binary', 'binary_set', b'binary_set', 'connected', b'connected', 'connectedArray', b'connectedArray', 'exported', b'exported', 'exportedArray', b'exportedArray', 'exportedTunnel', b'exportedTunnel', 'expr', b'expr', 'extract', b'extract', 'ifThenElse', b'ifThenElse', 'literal', b'literal', 'map_extract', b'map_extract', 'meta', b'meta', 'range', b'range', 'ref', b'ref', 'struct', b'struct', 'unary', b'unary', 'unary_set', b'unary_set'] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['array', b'array', 'assign', b'assign', 'assignTunnel', b'assignTunnel', 'binary', b'binary', 'binary_set', b'binary_set', 'connected', b'connected', 'connectedArray', b'connectedArray', 'exported', b'exported', 'exportedArray', b'exportedArray', 'exportedTunnel', b'exportedTunnel', 'expr', b'expr', 'extract', b'extract', 'ifThenElse', b'ifThenElse', 'literal', b'literal', 'map_extract', b'map_extract', 'meta', b'meta', 'range', b'range', 'ref', b'ref', 'struct', b'struct', 'unary', b'unary', 'unary_set', b'unary_set'] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... + _WhichOneofReturnType_expr: _TypeAlias = _typing.Literal['literal', 'binary', 'binary_set', 'unary', 'unary_set', 'array', 'struct', 'range', 'ifThenElse', 'extract', 'map_extract', 'connected', 'exported', 'connectedArray', 'exportedArray', 'assign', 'exportedTunnel', 'assignTunnel', 'ref'] + _WhichOneofArgType_expr: _TypeAlias = _typing.Literal['expr', b'expr'] + + def WhichOneof(self, oneof_group: _WhichOneofArgType_expr) -> _WhichOneofReturnType_expr | None: + ... +Global___ValueExpr: _TypeAlias = ValueExpr \ No newline at end of file diff --git a/edg/edgir/impl_pb2.py b/edg/edgir/impl_pb2.py index 2392b5cbe..47e51e529 100644 --- a/edg/edgir/impl_pb2.py +++ b/edg/edgir/impl_pb2.py @@ -1,18 +1,13 @@ """Generated protocol buffer code.""" - from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database - _sym_db = _symbol_database.Default() from ..edgir import common_pb2 as edgir_dot_common__pb2 - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\x10edgir/impl.proto\x12\nedgir.impl\x1a\x12edgir/common.proto"1\n\tBlockImpl\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata"0\n\x08PortImpl\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata"0\n\x08LinkImpl\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata"7\n\x0fEnvironmentImpl\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadatab\x06proto3' -) +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10edgir/impl.proto\x12\nedgir.impl\x1a\x12edgir/common.proto"1\n\tBlockImpl\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata"0\n\x08PortImpl\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata"0\n\x08LinkImpl\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata"7\n\x0fEnvironmentImpl\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadatab\x06proto3') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "edgir.impl_pb2", globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'edgir.impl_pb2', globals()) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None _BLOCKIMPL._serialized_start = 52 @@ -22,4 +17,4 @@ _LINKIMPL._serialized_start = 153 _LINKIMPL._serialized_end = 201 _ENVIRONMENTIMPL._serialized_start = 203 - _ENVIRONMENTIMPL._serialized_end = 258 + _ENVIRONMENTIMPL._serialized_end = 258 \ No newline at end of file diff --git a/edg/edgir/impl_pb2.pyi b/edg/edgir/impl_pb2.pyi index 3169fd28a..a38a4ffdd 100644 --- a/edg/edgir/impl_pb2.pyi +++ b/edg/edgir/impl_pb2.pyi @@ -10,14 +10,12 @@ stored. Fuck if I know what that will look like, so for now you just get a metadata block. """ - from edgir import common_pb2 as _common_pb2 from google.protobuf import descriptor as _descriptor from google.protobuf import message as _message import builtins as _builtins import sys import typing as _typing - if sys.version_info >= (3, 10): from typing import TypeAlias as _TypeAlias else: @@ -30,15 +28,19 @@ class BlockImpl(_message.Message): META_FIELD_NUMBER: _builtins.int @_builtins.property - def meta(self) -> _common_pb2.Metadata: ... - def __init__(self, *, meta: _common_pb2.Metadata | None = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta"] + def meta(self) -> _common_pb2.Metadata: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta"] + def __init__(self, *, meta: _common_pb2.Metadata | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___BlockImpl: _TypeAlias = BlockImpl @_typing.final @@ -47,15 +49,19 @@ class PortImpl(_message.Message): META_FIELD_NUMBER: _builtins.int @_builtins.property - def meta(self) -> _common_pb2.Metadata: ... - def __init__(self, *, meta: _common_pb2.Metadata | None = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta"] + def meta(self) -> _common_pb2.Metadata: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta"] + def __init__(self, *, meta: _common_pb2.Metadata | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___PortImpl: _TypeAlias = PortImpl @_typing.final @@ -64,15 +70,19 @@ class LinkImpl(_message.Message): META_FIELD_NUMBER: _builtins.int @_builtins.property - def meta(self) -> _common_pb2.Metadata: ... - def __init__(self, *, meta: _common_pb2.Metadata | None = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta"] + def meta(self) -> _common_pb2.Metadata: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta"] + def __init__(self, *, meta: _common_pb2.Metadata | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___LinkImpl: _TypeAlias = LinkImpl @_typing.final @@ -81,13 +91,17 @@ class EnvironmentImpl(_message.Message): META_FIELD_NUMBER: _builtins.int @_builtins.property - def meta(self) -> _common_pb2.Metadata: ... - def __init__(self, *, meta: _common_pb2.Metadata | None = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta"] + def meta(self) -> _common_pb2.Metadata: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta"] + def __init__(self, *, meta: _common_pb2.Metadata | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta'] -Global___EnvironmentImpl: _TypeAlias = EnvironmentImpl + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... +Global___EnvironmentImpl: _TypeAlias = EnvironmentImpl \ No newline at end of file diff --git a/edg/edgir/init_pb2.py b/edg/edgir/init_pb2.py index 6b6964627..92571bac8 100644 --- a/edg/edgir/init_pb2.py +++ b/edg/edgir/init_pb2.py @@ -1,19 +1,14 @@ """Generated protocol buffer code.""" - from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database - _sym_db = _symbol_database.Default() from ..edgir import common_pb2 as edgir_dot_common__pb2 - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\x10edgir/init.proto\x12\nedgir.init\x1a\x12edgir/common.proto"\xeb\x02\n\x07ValInit\x12\'\n\x08floating\x18\x01 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12&\n\x07integer\x18\x02 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12&\n\x07boolean\x18\x03 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12#\n\x04text\x18\x04 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12"\n\x03set\x18\x08 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12%\n\x06struct\x18\t \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12$\n\x05range\x18\n \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12$\n\x05array\x18\x0b \x01(\x0b2\x13.edgir.init.ValInitH\x00\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.MetadataB\x05\n\x03valb\x06proto3' -) +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10edgir/init.proto\x12\nedgir.init\x1a\x12edgir/common.proto"\xeb\x02\n\x07ValInit\x12\'\n\x08floating\x18\x01 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12&\n\x07integer\x18\x02 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12&\n\x07boolean\x18\x03 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12#\n\x04text\x18\x04 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12"\n\x03set\x18\x08 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12%\n\x06struct\x18\t \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12$\n\x05range\x18\n \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12$\n\x05array\x18\x0b \x01(\x0b2\x13.edgir.init.ValInitH\x00\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.MetadataB\x05\n\x03valb\x06proto3') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "edgir.init_pb2", globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'edgir.init_pb2', globals()) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None _VALINIT._serialized_start = 53 - _VALINIT._serialized_end = 416 + _VALINIT._serialized_end = 416 \ No newline at end of file diff --git a/edg/edgir/init_pb2.pyi b/edg/edgir/init_pb2.pyi index dce1504c7..534446937 100644 --- a/edg/edgir/init_pb2.pyi +++ b/edg/edgir/init_pb2.pyi @@ -11,14 +11,12 @@ creating a value. FIXME :: Does this make more sense in another file? """ - from edgir import common_pb2 as _common_pb2 from google.protobuf import descriptor as _descriptor from google.protobuf import message as _message import builtins as _builtins import sys import typing as _typing - if sys.version_info >= (3, 10): from typing import TypeAlias as _TypeAlias else: @@ -32,7 +30,6 @@ class ValInit(_message.Message): I think the frontend should have more type specific wrappers around this since the data required for each type can be different. """ - DESCRIPTOR: _descriptor.Descriptor FLOATING_FIELD_NUMBER: _builtins.int INTEGER_FIELD_NUMBER: _builtins.int @@ -45,89 +42,54 @@ class ValInit(_message.Message): META_FIELD_NUMBER: _builtins.int @_builtins.property - def floating(self) -> _common_pb2.Empty: ... + def floating(self) -> _common_pb2.Empty: + ... + @_builtins.property - def integer(self) -> _common_pb2.Empty: ... + def integer(self) -> _common_pb2.Empty: + ... + @_builtins.property - def boolean(self) -> _common_pb2.Empty: ... + def boolean(self) -> _common_pb2.Empty: + ... + @_builtins.property - def text(self) -> _common_pb2.Empty: ... + def text(self) -> _common_pb2.Empty: + ... + @_builtins.property - def set(self) -> _common_pb2.Empty: ... + def set(self) -> _common_pb2.Empty: + ... + @_builtins.property - def struct(self) -> _common_pb2.Empty: ... + def struct(self) -> _common_pb2.Empty: + ... + @_builtins.property - def range(self) -> _common_pb2.Empty: ... + def range(self) -> _common_pb2.Empty: + ... + @_builtins.property - def array(self) -> Global___ValInit: ... + def array(self) -> Global___ValInit: + ... + @_builtins.property - def meta(self) -> _common_pb2.Metadata: ... - def __init__( - self, - *, - floating: _common_pb2.Empty | None = ..., - integer: _common_pb2.Empty | None = ..., - boolean: _common_pb2.Empty | None = ..., - text: _common_pb2.Empty | None = ..., - set: _common_pb2.Empty | None = ..., - struct: _common_pb2.Empty | None = ..., - range: _common_pb2.Empty | None = ..., - array: Global___ValInit | None = ..., - meta: _common_pb2.Metadata | None = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal[ - "array", - b"array", - "boolean", - b"boolean", - "floating", - b"floating", - "integer", - b"integer", - "meta", - b"meta", - "range", - b"range", - "set", - b"set", - "struct", - b"struct", - "text", - b"text", - "val", - b"val", - ] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "array", - b"array", - "boolean", - b"boolean", - "floating", - b"floating", - "integer", - b"integer", - "meta", - b"meta", - "range", - b"range", - "set", - b"set", - "struct", - b"struct", - "text", - b"text", - "val", - b"val", - ] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - _WhichOneofReturnType_val: _TypeAlias = _typing.Literal[ - "floating", "integer", "boolean", "text", "set", "struct", "range", "array" - ] - _WhichOneofArgType_val: _TypeAlias = _typing.Literal["val", b"val"] - - def WhichOneof(self, oneof_group: _WhichOneofArgType_val) -> _WhichOneofReturnType_val | None: ... - -Global___ValInit: _TypeAlias = ValInit + def meta(self) -> _common_pb2.Metadata: + ... + + def __init__(self, *, floating: _common_pb2.Empty | None=..., integer: _common_pb2.Empty | None=..., boolean: _common_pb2.Empty | None=..., text: _common_pb2.Empty | None=..., set: _common_pb2.Empty | None=..., struct: _common_pb2.Empty | None=..., range: _common_pb2.Empty | None=..., array: Global___ValInit | None=..., meta: _common_pb2.Metadata | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['array', b'array', 'boolean', b'boolean', 'floating', b'floating', 'integer', b'integer', 'meta', b'meta', 'range', b'range', 'set', b'set', 'struct', b'struct', 'text', b'text', 'val', b'val'] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['array', b'array', 'boolean', b'boolean', 'floating', b'floating', 'integer', b'integer', 'meta', b'meta', 'range', b'range', 'set', b'set', 'struct', b'struct', 'text', b'text', 'val', b'val'] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... + _WhichOneofReturnType_val: _TypeAlias = _typing.Literal['floating', 'integer', 'boolean', 'text', 'set', 'struct', 'range', 'array'] + _WhichOneofArgType_val: _TypeAlias = _typing.Literal['val', b'val'] + + def WhichOneof(self, oneof_group: _WhichOneofArgType_val) -> _WhichOneofReturnType_val | None: + ... +Global___ValInit: _TypeAlias = ValInit \ No newline at end of file diff --git a/edg/edgir/lit_pb2.py b/edg/edgir/lit_pb2.py index 5fa7a1533..96d84789c 100644 --- a/edg/edgir/lit_pb2.py +++ b/edg/edgir/lit_pb2.py @@ -1,22 +1,17 @@ """Generated protocol buffer code.""" - from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database - _sym_db = _symbol_database.Default() from ..edgir import common_pb2 as edgir_dot_common__pb2 - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\x0fedgir/lit.proto\x12\tedgir.lit\x1a\x12edgir/common.proto"\x17\n\x08FloatLit\x12\x0b\n\x03val\x18\x01 \x01(\x01"\x15\n\x06IntLit\x12\x0b\n\x03val\x18\x01 \x01(\x12"\x16\n\x07BoolLit\x12\x0b\n\x03val\x18\x01 \x01(\x08"\x16\n\x07TextLit\x12\x0b\n\x03val\x18\x01 \x01(\t"V\n\x08RangeLit\x12$\n\x07minimum\x18\x01 \x01(\x0b2\x13.edgir.lit.ValueLit\x12$\n\x07maximum\x18\x02 \x01(\x0b2\x13.edgir.lit.ValueLit"\x84\x01\n\tStructLit\x122\n\x07members\x18\x01 \x03(\x0b2!.edgir.lit.StructLit.MembersEntry\x1aC\n\x0cMembersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12"\n\x05value\x18\x02 \x01(\x0b2\x13.edgir.lit.ValueLit:\x028\x01"-\n\x08ArrayLit\x12!\n\x04elts\x18\x01 \x03(\x0b2\x13.edgir.lit.ValueLit"\xc6\x02\n\x08ValueLit\x12\'\n\x08floating\x18\x01 \x01(\x0b2\x13.edgir.lit.FloatLitH\x00\x12$\n\x07integer\x18\x02 \x01(\x0b2\x11.edgir.lit.IntLitH\x00\x12%\n\x07boolean\x18\x03 \x01(\x0b2\x12.edgir.lit.BoolLitH\x00\x12"\n\x04text\x18\x04 \x01(\x0b2\x12.edgir.lit.TextLitH\x00\x12&\n\x06struct\x18\t \x01(\x0b2\x14.edgir.lit.StructLitH\x00\x12$\n\x05range\x18\n \x01(\x0b2\x13.edgir.lit.RangeLitH\x00\x12$\n\x05array\x18\x0b \x01(\x0b2\x13.edgir.lit.ArrayLitH\x00\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.MetadataB\x06\n\x04typeb\x06proto3' -) +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0fedgir/lit.proto\x12\tedgir.lit\x1a\x12edgir/common.proto"\x17\n\x08FloatLit\x12\x0b\n\x03val\x18\x01 \x01(\x01"\x15\n\x06IntLit\x12\x0b\n\x03val\x18\x01 \x01(\x12"\x16\n\x07BoolLit\x12\x0b\n\x03val\x18\x01 \x01(\x08"\x16\n\x07TextLit\x12\x0b\n\x03val\x18\x01 \x01(\t"V\n\x08RangeLit\x12$\n\x07minimum\x18\x01 \x01(\x0b2\x13.edgir.lit.ValueLit\x12$\n\x07maximum\x18\x02 \x01(\x0b2\x13.edgir.lit.ValueLit"\x84\x01\n\tStructLit\x122\n\x07members\x18\x01 \x03(\x0b2!.edgir.lit.StructLit.MembersEntry\x1aC\n\x0cMembersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12"\n\x05value\x18\x02 \x01(\x0b2\x13.edgir.lit.ValueLit:\x028\x01"-\n\x08ArrayLit\x12!\n\x04elts\x18\x01 \x03(\x0b2\x13.edgir.lit.ValueLit"\xc6\x02\n\x08ValueLit\x12\'\n\x08floating\x18\x01 \x01(\x0b2\x13.edgir.lit.FloatLitH\x00\x12$\n\x07integer\x18\x02 \x01(\x0b2\x11.edgir.lit.IntLitH\x00\x12%\n\x07boolean\x18\x03 \x01(\x0b2\x12.edgir.lit.BoolLitH\x00\x12"\n\x04text\x18\x04 \x01(\x0b2\x12.edgir.lit.TextLitH\x00\x12&\n\x06struct\x18\t \x01(\x0b2\x14.edgir.lit.StructLitH\x00\x12$\n\x05range\x18\n \x01(\x0b2\x13.edgir.lit.RangeLitH\x00\x12$\n\x05array\x18\x0b \x01(\x0b2\x13.edgir.lit.ArrayLitH\x00\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.MetadataB\x06\n\x04typeb\x06proto3') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "edgir.lit_pb2", globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'edgir.lit_pb2', globals()) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None _STRUCTLIT_MEMBERSENTRY._options = None - _STRUCTLIT_MEMBERSENTRY._serialized_options = b"8\x01" + _STRUCTLIT_MEMBERSENTRY._serialized_options = b'8\x01' _FLOATLIT._serialized_start = 50 _FLOATLIT._serialized_end = 73 _INTLIT._serialized_start = 75 @@ -34,4 +29,4 @@ _ARRAYLIT._serialized_start = 369 _ARRAYLIT._serialized_end = 414 _VALUELIT._serialized_start = 417 - _VALUELIT._serialized_end = 743 + _VALUELIT._serialized_end = 743 \ No newline at end of file diff --git a/edg/edgir/lit_pb2.pyi b/edg/edgir/lit_pb2.pyi index 1ed644162..7d821ab3c 100644 --- a/edg/edgir/lit_pb2.pyi +++ b/edg/edgir/lit_pb2.pyi @@ -7,7 +7,6 @@ Package : edg.lit Literals for assorted priitive types, i.e fixed constant values. """ - from collections import abc as _abc from edgir import common_pb2 as _common_pb2 from google.protobuf import descriptor as _descriptor @@ -16,7 +15,6 @@ from google.protobuf.internal import containers as _containers import builtins as _builtins import sys import typing as _typing - if sys.version_info >= (3, 10): from typing import TypeAlias as _TypeAlias else: @@ -28,16 +26,16 @@ class FloatLit(_message.Message): """* The core expression primitives we start with are the value literals that we can use """ - DESCRIPTOR: _descriptor.Descriptor VAL_FIELD_NUMBER: _builtins.int val: _builtins.float - def __init__(self, *, val: _builtins.float = ...) -> None: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["val", b"val"] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def __init__(self, *, val: _builtins.float=...) -> None: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['val', b'val'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___FloatLit: _TypeAlias = FloatLit @_typing.final @@ -46,11 +44,12 @@ class IntLit(_message.Message): VAL_FIELD_NUMBER: _builtins.int val: _builtins.int - def __init__(self, *, val: _builtins.int = ...) -> None: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["val", b"val"] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def __init__(self, *, val: _builtins.int=...) -> None: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['val', b'val'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___IntLit: _TypeAlias = IntLit @_typing.final @@ -59,11 +58,12 @@ class BoolLit(_message.Message): VAL_FIELD_NUMBER: _builtins.int val: _builtins.bool - def __init__(self, *, val: _builtins.bool = ...) -> None: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["val", b"val"] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def __init__(self, *, val: _builtins.bool=...) -> None: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['val', b'val'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___BoolLit: _TypeAlias = BoolLit @_typing.final @@ -72,11 +72,12 @@ class TextLit(_message.Message): VAL_FIELD_NUMBER: _builtins.int val: _builtins.str - def __init__(self, *, val: _builtins.str = ...) -> None: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["val", b"val"] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def __init__(self, *, val: _builtins.str=...) -> None: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['val', b'val'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___TextLit: _TypeAlias = TextLit @_typing.final @@ -86,17 +87,23 @@ class RangeLit(_message.Message): MAXIMUM_FIELD_NUMBER: _builtins.int @_builtins.property - def minimum(self) -> Global___ValueLit: ... + def minimum(self) -> Global___ValueLit: + ... + @_builtins.property - def maximum(self) -> Global___ValueLit: ... - def __init__(self, *, minimum: Global___ValueLit | None = ..., maximum: Global___ValueLit | None = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["maximum", b"maximum", "minimum", b"minimum"] + def maximum(self) -> Global___ValueLit: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["maximum", b"maximum", "minimum", b"minimum"] + def __init__(self, *, minimum: Global___ValueLit | None=..., maximum: Global___ValueLit | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['maximum', b'maximum', 'minimum', b'minimum'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['maximum', b'maximum', 'minimum', b'minimum'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___RangeLit: _TypeAlias = RangeLit @_typing.final @@ -111,24 +118,31 @@ class StructLit(_message.Message): key: _builtins.str @_builtins.property - def value(self) -> Global___ValueLit: ... - def __init__(self, *, key: _builtins.str = ..., value: Global___ValueLit | None = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["value", b"value"] + def value(self) -> Global___ValueLit: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["key", b"key", "value", b"value"] + def __init__(self, *, key: _builtins.str=..., value: Global___ValueLit | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['value', b'value'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['key', b'key', 'value', b'value'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... MEMBERS_FIELD_NUMBER: _builtins.int @_builtins.property - def members(self) -> _containers.MessageMap[_builtins.str, Global___ValueLit]: ... - def __init__(self, *, members: _abc.Mapping[_builtins.str, Global___ValueLit] | None = ...) -> None: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["members", b"members"] + def members(self) -> _containers.MessageMap[_builtins.str, Global___ValueLit]: + ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def __init__(self, *, members: _abc.Mapping[_builtins.str, Global___ValueLit] | None=...) -> None: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['members', b'members'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___StructLit: _TypeAlias = StructLit @_typing.final @@ -137,12 +151,15 @@ class ArrayLit(_message.Message): ELTS_FIELD_NUMBER: _builtins.int @_builtins.property - def elts(self) -> _containers.RepeatedCompositeFieldContainer[Global___ValueLit]: ... - def __init__(self, *, elts: _abc.Iterable[Global___ValueLit] | None = ...) -> None: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["elts", b"elts"] + def elts(self) -> _containers.RepeatedCompositeFieldContainer[Global___ValueLit]: + ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def __init__(self, *, elts: _abc.Iterable[Global___ValueLit] | None=...) -> None: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['elts', b'elts'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___ArrayLit: _TypeAlias = ArrayLit @_typing.final @@ -158,82 +175,50 @@ class ValueLit(_message.Message): META_FIELD_NUMBER: _builtins.int @_builtins.property - def floating(self) -> Global___FloatLit: ... + def floating(self) -> Global___FloatLit: + ... + @_builtins.property - def integer(self) -> Global___IntLit: ... + def integer(self) -> Global___IntLit: + ... + @_builtins.property - def boolean(self) -> Global___BoolLit: ... + def boolean(self) -> Global___BoolLit: + ... + @_builtins.property - def text(self) -> Global___TextLit: ... + def text(self) -> Global___TextLit: + ... + @_builtins.property - def struct(self) -> Global___StructLit: ... + def struct(self) -> Global___StructLit: + ... + @_builtins.property - def range(self) -> Global___RangeLit: ... + def range(self) -> Global___RangeLit: + ... + @_builtins.property - def array(self) -> Global___ArrayLit: ... + def array(self) -> Global___ArrayLit: + ... + @_builtins.property - def meta(self) -> _common_pb2.Metadata: ... - def __init__( - self, - *, - floating: Global___FloatLit | None = ..., - integer: Global___IntLit | None = ..., - boolean: Global___BoolLit | None = ..., - text: Global___TextLit | None = ..., - struct: Global___StructLit | None = ..., - range: Global___RangeLit | None = ..., - array: Global___ArrayLit | None = ..., - meta: _common_pb2.Metadata | None = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal[ - "array", - b"array", - "boolean", - b"boolean", - "floating", - b"floating", - "integer", - b"integer", - "meta", - b"meta", - "range", - b"range", - "struct", - b"struct", - "text", - b"text", - "type", - b"type", - ] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "array", - b"array", - "boolean", - b"boolean", - "floating", - b"floating", - "integer", - b"integer", - "meta", - b"meta", - "range", - b"range", - "struct", - b"struct", - "text", - b"text", - "type", - b"type", - ] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - _WhichOneofReturnType_type: _TypeAlias = _typing.Literal[ - "floating", "integer", "boolean", "text", "struct", "range", "array" - ] - _WhichOneofArgType_type: _TypeAlias = _typing.Literal["type", b"type"] - - def WhichOneof(self, oneof_group: _WhichOneofArgType_type) -> _WhichOneofReturnType_type | None: ... - -Global___ValueLit: _TypeAlias = ValueLit + def meta(self) -> _common_pb2.Metadata: + ... + + def __init__(self, *, floating: Global___FloatLit | None=..., integer: Global___IntLit | None=..., boolean: Global___BoolLit | None=..., text: Global___TextLit | None=..., struct: Global___StructLit | None=..., range: Global___RangeLit | None=..., array: Global___ArrayLit | None=..., meta: _common_pb2.Metadata | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['array', b'array', 'boolean', b'boolean', 'floating', b'floating', 'integer', b'integer', 'meta', b'meta', 'range', b'range', 'struct', b'struct', 'text', b'text', 'type', b'type'] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['array', b'array', 'boolean', b'boolean', 'floating', b'floating', 'integer', b'integer', 'meta', b'meta', 'range', b'range', 'struct', b'struct', 'text', b'text', 'type', b'type'] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... + _WhichOneofReturnType_type: _TypeAlias = _typing.Literal['floating', 'integer', 'boolean', 'text', 'struct', 'range', 'array'] + _WhichOneofArgType_type: _TypeAlias = _typing.Literal['type', b'type'] + + def WhichOneof(self, oneof_group: _WhichOneofArgType_type) -> _WhichOneofReturnType_type | None: + ... +Global___ValueLit: _TypeAlias = ValueLit \ No newline at end of file diff --git a/edg/edgir/name_pb2.py b/edg/edgir/name_pb2.py index 5d32702a7..1b64ac05f 100644 --- a/edg/edgir/name_pb2.py +++ b/edg/edgir/name_pb2.py @@ -1,21 +1,16 @@ """Generated protocol buffer code.""" - from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database - _sym_db = _symbol_database.Default() from ..edgir import common_pb2 as edgir_dot_common__pb2 - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\x10edgir/name.proto\x12\nedgir.name\x1a\x12edgir/common.proto"O\n\tNamespace\x12\x0f\n\x05basic\x18\x01 \x01(\tH\x00\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.MetadataB\x0b\n\tnamespace"A\n\x0bLibraryName\x12\x0c\n\x04name\x18\x02 \x01(\t\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadatab\x06proto3' -) +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10edgir/name.proto\x12\nedgir.name\x1a\x12edgir/common.proto"O\n\tNamespace\x12\x0f\n\x05basic\x18\x01 \x01(\tH\x00\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.MetadataB\x0b\n\tnamespace"A\n\x0bLibraryName\x12\x0c\n\x04name\x18\x02 \x01(\t\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadatab\x06proto3') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "edgir.name_pb2", globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'edgir.name_pb2', globals()) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None _NAMESPACE._serialized_start = 52 _NAMESPACE._serialized_end = 131 _LIBRARYNAME._serialized_start = 133 - _LIBRARYNAME._serialized_end = 198 + _LIBRARYNAME._serialized_end = 198 \ No newline at end of file diff --git a/edg/edgir/name_pb2.pyi b/edg/edgir/name_pb2.pyi index 5b30f799c..50564b2fe 100644 --- a/edg/edgir/name_pb2.pyi +++ b/edg/edgir/name_pb2.pyi @@ -10,14 +10,12 @@ There are three major classes of name in edg: - LocalNames, which help organize elements relative to each other. - LibraryNames, which we use to identify specific libraries. """ - from edgir import common_pb2 as _common_pb2 from google.protobuf import descriptor as _descriptor from google.protobuf import message as _message import builtins as _builtins import sys import typing as _typing - if sys.version_info >= (3, 10): from typing import TypeAlias as _TypeAlias else: @@ -31,7 +29,6 @@ class Namespace(_message.Message): over items in the library. It lets us group elements in categories that are orthogonal to the usual Block, Port, Link, ontology. """ - DESCRIPTOR: _descriptor.Descriptor BASIC_FIELD_NUMBER: _builtins.int META_FIELD_NUMBER: _builtins.int @@ -39,19 +36,24 @@ class Namespace(_message.Message): "* Basic namespaces are a way to organize library elements into a\n useful hirearchy (e.g. 'Core.*' for the most primitive definitions\n that we define, or 'NXP.*' for NXP made components.)\n\n Basic namespaces should have the following properties:\n\n - First char is a capital letter\n - All other chars must be letters, numbers, '-', '<', '>'\n - CamelCase is preffered, don't use any symbols in the name\n if possible.\n " @_builtins.property - def meta(self) -> _common_pb2.Metadata: ... - def __init__(self, *, basic: _builtins.str = ..., meta: _common_pb2.Metadata | None = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["basic", b"basic", "meta", b"meta", "namespace", b"namespace"] + def meta(self) -> _common_pb2.Metadata: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["basic", b"basic", "meta", b"meta", "namespace", b"namespace"] + def __init__(self, *, basic: _builtins.str=..., meta: _common_pb2.Metadata | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['basic', b'basic', 'meta', b'meta', 'namespace', b'namespace'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - _WhichOneofReturnType_namespace: _TypeAlias = _typing.Literal["basic"] - _WhichOneofArgType_namespace: _TypeAlias = _typing.Literal["namespace", b"namespace"] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['basic', b'basic', 'meta', b'meta', 'namespace', b'namespace'] - def WhichOneof(self, oneof_group: _WhichOneofArgType_namespace) -> _WhichOneofReturnType_namespace | None: ... + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... + _WhichOneofReturnType_namespace: _TypeAlias = _typing.Literal['basic'] + _WhichOneofArgType_namespace: _TypeAlias = _typing.Literal['namespace', b'namespace'] + def WhichOneof(self, oneof_group: _WhichOneofArgType_namespace) -> _WhichOneofReturnType_namespace | None: + ... Global___Namespace: _TypeAlias = Namespace @_typing.final @@ -61,7 +63,6 @@ class LibraryName(_message.Message): This can be the initial element in a path or reference. """ - DESCRIPTOR: _descriptor.Descriptor NAME_FIELD_NUMBER: _builtins.int META_FIELD_NUMBER: _builtins.int @@ -69,13 +70,17 @@ class LibraryName(_message.Message): "* Since libraries allow for inheritance, we will often want to say\n this element, defined in *this* particular library.\n\n In those cases we want to be able to specify the relevant library\n by its identifier.\n\n Otherwise we assume it's somehow implicit which library we're\n talking about.\n " @_builtins.property - def meta(self) -> _common_pb2.Metadata: ... - def __init__(self, *, name: _builtins.str = ..., meta: _common_pb2.Metadata | None = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta"] + def meta(self) -> _common_pb2.Metadata: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta", "name", b"name"] + def __init__(self, *, name: _builtins.str=..., meta: _common_pb2.Metadata | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta', 'name', b'name'] -Global___LibraryName: _TypeAlias = LibraryName + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... +Global___LibraryName: _TypeAlias = LibraryName \ No newline at end of file diff --git a/edg/edgir/ref_pb2.py b/edg/edgir/ref_pb2.py index ee4f3fd9c..154cb44fb 100644 --- a/edg/edgir/ref_pb2.py +++ b/edg/edgir/ref_pb2.py @@ -1,19 +1,14 @@ """Generated protocol buffer code.""" - from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database - _sym_db = _symbol_database.Default() from ..edgir import common_pb2 as edgir_dot_common__pb2 from ..edgir import name_pb2 as edgir_dot_name__pb2 - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\x0fedgir/ref.proto\x12\tedgir.ref\x1a\x12edgir/common.proto\x1a\x10edgir/name.proto"f\n\tLocalStep\x12-\n\x0ereserved_param\x18\x01 \x01(\x0e2\x13.edgir.ref.ReservedH\x00\x12\x12\n\x08allocate\x18\x02 \x01(\tH\x00\x12\x0e\n\x04name\x18\x03 \x01(\tH\x00B\x06\n\x04step"W\n\tLocalPath\x12#\n\x05steps\x18\x01 \x03(\x0b2\x14.edgir.ref.LocalStep\x12%\n\x04meta\x18\xff\x01 \x01(\x0b2\x16.edgir.common.Metadata"\xa8\x01\n\x0bLibraryPath\x12&\n\x05start\x18\x01 \x01(\x0b2\x17.edgir.name.LibraryName\x12$\n\x05steps\x18\x02 \x03(\x0b2\x15.edgir.name.Namespace\x12$\n\x06target\x18\x03 \x01(\x0b2\x14.edgir.ref.LocalStep\x12%\n\x04meta\x18\xff\x01 \x01(\x0b2\x16.edgir.common.Metadata*r\n\x08Reserved\x12\r\n\tUNDEFINED\x10\x00\x12\x12\n\x0eCONNECTED_LINK\x10\x01\x12\x10\n\x0cIS_CONNECTED\x10(\x12\n\n\x06LENGTH\x10*\x12\x08\n\x04NAME\x10,\x12\x0c\n\x08ELEMENTS\x10-\x12\r\n\tALLOCATED\x10.b\x06proto3' -) +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0fedgir/ref.proto\x12\tedgir.ref\x1a\x12edgir/common.proto\x1a\x10edgir/name.proto"f\n\tLocalStep\x12-\n\x0ereserved_param\x18\x01 \x01(\x0e2\x13.edgir.ref.ReservedH\x00\x12\x12\n\x08allocate\x18\x02 \x01(\tH\x00\x12\x0e\n\x04name\x18\x03 \x01(\tH\x00B\x06\n\x04step"W\n\tLocalPath\x12#\n\x05steps\x18\x01 \x03(\x0b2\x14.edgir.ref.LocalStep\x12%\n\x04meta\x18\xff\x01 \x01(\x0b2\x16.edgir.common.Metadata"\xa8\x01\n\x0bLibraryPath\x12&\n\x05start\x18\x01 \x01(\x0b2\x17.edgir.name.LibraryName\x12$\n\x05steps\x18\x02 \x03(\x0b2\x15.edgir.name.Namespace\x12$\n\x06target\x18\x03 \x01(\x0b2\x14.edgir.ref.LocalStep\x12%\n\x04meta\x18\xff\x01 \x01(\x0b2\x16.edgir.common.Metadata*r\n\x08Reserved\x12\r\n\tUNDEFINED\x10\x00\x12\x12\n\x0eCONNECTED_LINK\x10\x01\x12\x10\n\x0cIS_CONNECTED\x10(\x12\n\n\x06LENGTH\x10*\x12\x08\n\x04NAME\x10,\x12\x0c\n\x08ELEMENTS\x10-\x12\r\n\tALLOCATED\x10.b\x06proto3') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "edgir.ref_pb2", globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'edgir.ref_pb2', globals()) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None _RESERVED._serialized_start = 432 @@ -23,4 +18,4 @@ _LOCALPATH._serialized_start = 172 _LOCALPATH._serialized_end = 259 _LIBRARYPATH._serialized_start = 262 - _LIBRARYPATH._serialized_end = 430 + _LIBRARYPATH._serialized_end = 430 \ No newline at end of file diff --git a/edg/edgir/ref_pb2.pyi b/edg/edgir/ref_pb2.pyi index 992c4f924..4cb753aaf 100644 --- a/edg/edgir/ref_pb2.pyi +++ b/edg/edgir/ref_pb2.pyi @@ -11,7 +11,6 @@ referencing different elements in a designs or libraries. We enforce certain structural properties by having a series of nested 'steps' that determine the next step in a path reference. """ - from collections import abc as _abc from edgir import common_pb2 as _common_pb2 from edgir import name_pb2 as _name_pb2 @@ -22,7 +21,6 @@ from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper import builtins as _builtins import sys import typing as _typing - if sys.version_info >= (3, 10): from typing import TypeAlias as _TypeAlias else: @@ -30,42 +28,41 @@ else: DESCRIPTOR: _descriptor.FileDescriptor class _Reserved: - ValueType = _typing.NewType("ValueType", _builtins.int) + ValueType = _typing.NewType('ValueType', _builtins.int) V: _TypeAlias = ValueType class _ReservedEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_Reserved.ValueType], _builtins.type): DESCRIPTOR: _descriptor.EnumDescriptor UNDEFINED: _Reserved.ValueType CONNECTED_LINK: _Reserved.ValueType - "* Directions we could move" + '* Directions we could move' IS_CONNECTED: _Reserved.ValueType - "* reserved parameters\n true implies CONNECTED_LINK resolves; not available on PortArray\n " + '* reserved parameters\n true implies CONNECTED_LINK resolves; not available on PortArray\n ' LENGTH: _Reserved.ValueType - " EXISTS = 41;\n available on PortArray and LinkArray\n " + ' EXISTS = 41;\n available on PortArray and LinkArray\n ' NAME: _Reserved.ValueType ELEMENTS: _Reserved.ValueType - "available on PortArray and LinkArray, returns a list of string of element names" + 'available on PortArray and LinkArray, returns a list of string of element names' ALLOCATED: _Reserved.ValueType - "cannot be used as a generator dependency\n available on PortArray, returns a list of string of incoming connection names,\n " + 'cannot be used as a generator dependency\n available on PortArray, returns a list of string of incoming connection names,\n ' class Reserved(_Reserved, metaclass=_ReservedEnumTypeWrapper): """* These are reserved terms that we'll end up using in various places. I'd rather have these in the block/link/bridges where they're going to exist, but that's not possible without polymorphism protibuf doesn't have """ - UNDEFINED: Reserved.ValueType CONNECTED_LINK: Reserved.ValueType -"* Directions we could move" +'* Directions we could move' IS_CONNECTED: Reserved.ValueType -"* reserved parameters\ntrue implies CONNECTED_LINK resolves; not available on PortArray\n" +'* reserved parameters\ntrue implies CONNECTED_LINK resolves; not available on PortArray\n' LENGTH: Reserved.ValueType -" EXISTS = 41;\navailable on PortArray and LinkArray\n" +' EXISTS = 41;\navailable on PortArray and LinkArray\n' NAME: Reserved.ValueType ELEMENTS: Reserved.ValueType -"available on PortArray and LinkArray, returns a list of string of element names" +'available on PortArray and LinkArray, returns a list of string of element names' ALLOCATED: Reserved.ValueType -"cannot be used as a generator dependency\navailable on PortArray, returns a list of string of incoming connection names,\n" +'cannot be used as a generator dependency\navailable on PortArray, returns a list of string of incoming connection names,\n' Global___Reserved: _TypeAlias = Reserved @_typing.final @@ -76,39 +73,31 @@ class LocalStep(_message.Message): The directions encode the type of thing we are referencing, but to the user all of these look just like local variables """ - DESCRIPTOR: _descriptor.Descriptor RESERVED_PARAM_FIELD_NUMBER: _builtins.int ALLOCATE_FIELD_NUMBER: _builtins.int NAME_FIELD_NUMBER: _builtins.int reserved_param: Global___Reserved.ValueType allocate: _builtins.str - "Allocates a new element in an array, valid for arrays only.\n Empty string means automatically allocated, while a non-empty string is a suggested name.\n " + 'Allocates a new element in an array, valid for arrays only.\n Empty string means automatically allocated, while a non-empty string is a suggested name.\n ' name: _builtins.str "*\n A local name is what something is called in the context of its parent,\n whether that parent is a namespace (as in the library) or some other\n element (as in a design or heirarchy block).\n\n localNames should have the following properties:\n\n - First char is a lower case letter\n - All other chars must be letters, numbers, '-', '<', '>'\n - lowerCamelCase is preffered, don't use any symbols in the name\n if possible.\n\n These are style guidelines, literally any string will work.\n " - def __init__( - self, - *, - reserved_param: Global___Reserved.ValueType = ..., - allocate: _builtins.str = ..., - name: _builtins.str = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal[ - "allocate", b"allocate", "name", b"name", "reserved_param", b"reserved_param", "step", b"step" - ] + def __init__(self, *, reserved_param: Global___Reserved.ValueType=..., allocate: _builtins.str=..., name: _builtins.str=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['allocate', b'allocate', 'name', b'name', 'reserved_param', b'reserved_param', 'step', b'step'] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "allocate", b"allocate", "name", b"name", "reserved_param", b"reserved_param", "step", b"step" - ] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['allocate', b'allocate', 'name', b'name', 'reserved_param', b'reserved_param', 'step', b'step'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - _WhichOneofReturnType_step: _TypeAlias = _typing.Literal["reserved_param", "allocate", "name"] - _WhichOneofArgType_step: _TypeAlias = _typing.Literal["step", b"step"] - - def WhichOneof(self, oneof_group: _WhichOneofArgType_step) -> _WhichOneofReturnType_step | None: ... + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... + _WhichOneofReturnType_step: _TypeAlias = _typing.Literal['reserved_param', 'allocate', 'name'] + _WhichOneofArgType_step: _TypeAlias = _typing.Literal['step', b'step'] + def WhichOneof(self, oneof_group: _WhichOneofArgType_step) -> _WhichOneofReturnType_step | None: + ... Global___LocalStep: _TypeAlias = LocalStep @_typing.final @@ -116,25 +105,28 @@ class LocalPath(_message.Message): """* This is a path from a local context to some other local context. To be used as a reference. """ - DESCRIPTOR: _descriptor.Descriptor STEPS_FIELD_NUMBER: _builtins.int META_FIELD_NUMBER: _builtins.int @_builtins.property - def steps(self) -> _containers.RepeatedCompositeFieldContainer[Global___LocalStep]: ... + def steps(self) -> _containers.RepeatedCompositeFieldContainer[Global___LocalStep]: + ... + @_builtins.property - def meta(self) -> _common_pb2.Metadata: ... - def __init__( - self, *, steps: _abc.Iterable[Global___LocalStep] | None = ..., meta: _common_pb2.Metadata | None = ... - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta"] + def meta(self) -> _common_pb2.Metadata: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta", "steps", b"steps"] + def __init__(self, *, steps: _abc.Iterable[Global___LocalStep] | None=..., meta: _common_pb2.Metadata | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta', 'steps', b'steps'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___LocalPath: _TypeAlias = LocalPath @_typing.final @@ -142,7 +134,6 @@ class LibraryPath(_message.Message): """* This is a path to an element within a library from the root of a library. To be used as a way to reference such elements. """ - DESCRIPTOR: _descriptor.Descriptor START_FIELD_NUMBER: _builtins.int STEPS_FIELD_NUMBER: _builtins.int @@ -150,28 +141,29 @@ class LibraryPath(_message.Message): META_FIELD_NUMBER: _builtins.int @_builtins.property - def start(self) -> _name_pb2.LibraryName: ... + def start(self) -> _name_pb2.LibraryName: + ... + @_builtins.property - def steps(self) -> _containers.RepeatedCompositeFieldContainer[_name_pb2.Namespace]: ... + def steps(self) -> _containers.RepeatedCompositeFieldContainer[_name_pb2.Namespace]: + ... + @_builtins.property - def target(self) -> Global___LocalStep: ... + def target(self) -> Global___LocalStep: + ... + @_builtins.property - def meta(self) -> _common_pb2.Metadata: ... - def __init__( - self, - *, - start: _name_pb2.LibraryName | None = ..., - steps: _abc.Iterable[_name_pb2.Namespace] | None = ..., - target: Global___LocalStep | None = ..., - meta: _common_pb2.Metadata | None = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta", "start", b"start", "target", b"target"] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "meta", b"meta", "start", b"start", "steps", b"steps", "target", b"target" - ] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - -Global___LibraryPath: _TypeAlias = LibraryPath + def meta(self) -> _common_pb2.Metadata: + ... + + def __init__(self, *, start: _name_pb2.LibraryName | None=..., steps: _abc.Iterable[_name_pb2.Namespace] | None=..., target: Global___LocalStep | None=..., meta: _common_pb2.Metadata | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta', 'start', b'start', 'target', b'target'] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta', 'start', b'start', 'steps', b'steps', 'target', b'target'] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... +Global___LibraryPath: _TypeAlias = LibraryPath \ No newline at end of file diff --git a/edg/edgir/schema_pb2.py b/edg/edgir/schema_pb2.py index 515fd4516..46253e26c 100644 --- a/edg/edgir/schema_pb2.py +++ b/edg/edgir/schema_pb2.py @@ -1,23 +1,18 @@ """Generated protocol buffer code.""" - from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database - _sym_db = _symbol_database.Default() from ..edgir import common_pb2 as edgir_dot_common__pb2 from ..edgir import elem_pb2 as edgir_dot_elem__pb2 - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\x12edgir/schema.proto\x12\x0cedgir.schema\x1a\x12edgir/common.proto\x1a\x10edgir/elem.proto"\xf5\x03\n\x07Library\x12*\n\x02id\x18\x01 \x01(\x0b2\x1e.edgir.schema.Library.LibIdent\x12\x0f\n\x07imports\x18\x02 \x03(\t\x12&\n\x04root\x18\n \x01(\x0b2\x18.edgir.schema.Library.NS\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata\x1a\xc4\x02\n\x02NS\x126\n\x07members\x18\x01 \x03(\x0b2%.edgir.schema.Library.NS.MembersEntry\x1a\xb7\x01\n\x03Val\x12 \n\x04port\x18\n \x01(\x0b2\x10.edgir.elem.PortH\x00\x125\n\x0fhierarchy_block\x18\r \x01(\x0b2\x1a.edgir.elem.HierarchyBlockH\x00\x12 \n\x04link\x18\x0e \x01(\x0b2\x10.edgir.elem.LinkH\x00\x12-\n\tnamespace\x18\x14 \x01(\x0b2\x18.edgir.schema.Library.NSH\x00B\x06\n\x04type\x1aL\n\x0cMembersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12+\n\x05value\x18\x02 \x01(\x0b2\x1c.edgir.schema.Library.NS.Val:\x028\x01\x1a\x18\n\x08LibIdent\x12\x0c\n\x04name\x18\x01 \x01(\t"6\n\x06Design\x12,\n\x08contents\x18\x02 \x01(\x0b2\x1a.edgir.elem.HierarchyBlockb\x06proto3' -) +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12edgir/schema.proto\x12\x0cedgir.schema\x1a\x12edgir/common.proto\x1a\x10edgir/elem.proto"\xf5\x03\n\x07Library\x12*\n\x02id\x18\x01 \x01(\x0b2\x1e.edgir.schema.Library.LibIdent\x12\x0f\n\x07imports\x18\x02 \x03(\t\x12&\n\x04root\x18\n \x01(\x0b2\x18.edgir.schema.Library.NS\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata\x1a\xc4\x02\n\x02NS\x126\n\x07members\x18\x01 \x03(\x0b2%.edgir.schema.Library.NS.MembersEntry\x1a\xb7\x01\n\x03Val\x12 \n\x04port\x18\n \x01(\x0b2\x10.edgir.elem.PortH\x00\x125\n\x0fhierarchy_block\x18\r \x01(\x0b2\x1a.edgir.elem.HierarchyBlockH\x00\x12 \n\x04link\x18\x0e \x01(\x0b2\x10.edgir.elem.LinkH\x00\x12-\n\tnamespace\x18\x14 \x01(\x0b2\x18.edgir.schema.Library.NSH\x00B\x06\n\x04type\x1aL\n\x0cMembersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12+\n\x05value\x18\x02 \x01(\x0b2\x1c.edgir.schema.Library.NS.Val:\x028\x01\x1a\x18\n\x08LibIdent\x12\x0c\n\x04name\x18\x01 \x01(\t"6\n\x06Design\x12,\n\x08contents\x18\x02 \x01(\x0b2\x1a.edgir.elem.HierarchyBlockb\x06proto3') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "edgir.schema_pb2", globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'edgir.schema_pb2', globals()) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None _LIBRARY_NS_MEMBERSENTRY._options = None - _LIBRARY_NS_MEMBERSENTRY._serialized_options = b"8\x01" + _LIBRARY_NS_MEMBERSENTRY._serialized_options = b'8\x01' _LIBRARY._serialized_start = 75 _LIBRARY._serialized_end = 576 _LIBRARY_NS._serialized_start = 226 @@ -29,4 +24,4 @@ _LIBRARY_LIBIDENT._serialized_start = 552 _LIBRARY_LIBIDENT._serialized_end = 576 _DESIGN._serialized_start = 578 - _DESIGN._serialized_end = 632 + _DESIGN._serialized_end = 632 \ No newline at end of file diff --git a/edg/edgir/schema_pb2.pyi b/edg/edgir/schema_pb2.pyi index 3080870ab..eeb7ebf64 100644 --- a/edg/edgir/schema_pb2.pyi +++ b/edg/edgir/schema_pb2.pyi @@ -8,7 +8,6 @@ Package : edg.schema These types contain the highest level data structures we use to describe sets of blocks, ports, and links. """ - from collections import abc as _abc from edgir import common_pb2 as _common_pb2 from edgir import elem_pb2 as _elem_pb2 @@ -18,7 +17,6 @@ from google.protobuf.internal import containers as _containers import builtins as _builtins import sys import typing as _typing - if sys.version_info >= (3, 10): from typing import TypeAlias as _TypeAlias else: @@ -37,13 +35,11 @@ class Library(_message.Message): or definitional conflicts. This means that we can shuffle around partial libraries, for merging, modification, etc.. """ - DESCRIPTOR: _descriptor.Descriptor @_typing.final class NS(_message.Message): """* Library Namespace, avoiding collision w/ edg.name.Namespace""" - DESCRIPTOR: _descriptor.Descriptor @_typing.final @@ -55,53 +51,36 @@ class Library(_message.Message): NAMESPACE_FIELD_NUMBER: _builtins.int @_builtins.property - def port(self) -> _elem_pb2.Port: ... + def port(self) -> _elem_pb2.Port: + ... + @_builtins.property - def hierarchy_block(self) -> _elem_pb2.HierarchyBlock: ... + def hierarchy_block(self) -> _elem_pb2.HierarchyBlock: + ... + @_builtins.property - def link(self) -> _elem_pb2.Link: ... + def link(self) -> _elem_pb2.Link: + ... + @_builtins.property - def namespace(self) -> Global___Library.NS: ... - def __init__( - self, - *, - port: _elem_pb2.Port | None = ..., - hierarchy_block: _elem_pb2.HierarchyBlock | None = ..., - link: _elem_pb2.Link | None = ..., - namespace: Global___Library.NS | None = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal[ - "hierarchy_block", - b"hierarchy_block", - "link", - b"link", - "namespace", - b"namespace", - "port", - b"port", - "type", - b"type", - ] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "hierarchy_block", - b"hierarchy_block", - "link", - b"link", - "namespace", - b"namespace", - "port", - b"port", - "type", - b"type", - ] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - _WhichOneofReturnType_type: _TypeAlias = _typing.Literal["port", "hierarchy_block", "link", "namespace"] - _WhichOneofArgType_type: _TypeAlias = _typing.Literal["type", b"type"] - - def WhichOneof(self, oneof_group: _WhichOneofArgType_type) -> _WhichOneofReturnType_type | None: ... + def namespace(self) -> Global___Library.NS: + ... + + def __init__(self, *, port: _elem_pb2.Port | None=..., hierarchy_block: _elem_pb2.HierarchyBlock | None=..., link: _elem_pb2.Link | None=..., namespace: Global___Library.NS | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['hierarchy_block', b'hierarchy_block', 'link', b'link', 'namespace', b'namespace', 'port', b'port', 'type', b'type'] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['hierarchy_block', b'hierarchy_block', 'link', b'link', 'namespace', b'namespace', 'port', b'port', 'type', b'type'] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... + _WhichOneofReturnType_type: _TypeAlias = _typing.Literal['port', 'hierarchy_block', 'link', 'namespace'] + _WhichOneofArgType_type: _TypeAlias = _typing.Literal['type', b'type'] + + def WhichOneof(self, oneof_group: _WhichOneofArgType_type) -> _WhichOneofReturnType_type | None: + ... @_typing.final class MembersEntry(_message.Message): @@ -111,75 +90,83 @@ class Library(_message.Message): key: _builtins.str @_builtins.property - def value(self) -> Global___Library.NS.Val: ... - def __init__(self, *, key: _builtins.str = ..., value: Global___Library.NS.Val | None = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["value", b"value"] + def value(self) -> Global___Library.NS.Val: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["key", b"key", "value", b"value"] + def __init__(self, *, key: _builtins.str=..., value: Global___Library.NS.Val | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['value', b'value'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['key', b'key', 'value', b'value'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... MEMBERS_FIELD_NUMBER: _builtins.int @_builtins.property - def members(self) -> _containers.MessageMap[_builtins.str, Global___Library.NS.Val]: ... - def __init__(self, *, members: _abc.Mapping[_builtins.str, Global___Library.NS.Val] | None = ...) -> None: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["members", b"members"] + def members(self) -> _containers.MessageMap[_builtins.str, Global___Library.NS.Val]: + ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def __init__(self, *, members: _abc.Mapping[_builtins.str, Global___Library.NS.Val] | None=...) -> None: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['members', b'members'] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... @_typing.final class LibIdent(_message.Message): """* How we identify a library within a set. Will probably evolve to capture more metadata. """ - DESCRIPTOR: _descriptor.Descriptor NAME_FIELD_NUMBER: _builtins.int name: _builtins.str - def __init__(self, *, name: _builtins.str = ...) -> None: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["name", b"name"] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def __init__(self, *, name: _builtins.str=...) -> None: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['name', b'name'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... ID_FIELD_NUMBER: _builtins.int IMPORTS_FIELD_NUMBER: _builtins.int ROOT_FIELD_NUMBER: _builtins.int META_FIELD_NUMBER: _builtins.int @_builtins.property - def id(self) -> Global___Library.LibIdent: ... + def id(self) -> Global___Library.LibIdent: + ... + @_builtins.property - def imports(self) -> _containers.RepeatedScalarFieldContainer[_builtins.str]: ... + def imports(self) -> _containers.RepeatedScalarFieldContainer[_builtins.str]: + ... + @_builtins.property - def root(self) -> Global___Library.NS: ... + def root(self) -> Global___Library.NS: + ... + @_builtins.property - def meta(self) -> _common_pb2.Metadata: ... - def __init__( - self, - *, - id: Global___Library.LibIdent | None = ..., - imports: _abc.Iterable[_builtins.str] | None = ..., - root: Global___Library.NS | None = ..., - meta: _common_pb2.Metadata | None = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["id", b"id", "meta", b"meta", "root", b"root"] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "id", b"id", "imports", b"imports", "meta", b"meta", "root", b"root" - ] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def meta(self) -> _common_pb2.Metadata: + ... + + def __init__(self, *, id: Global___Library.LibIdent | None=..., imports: _abc.Iterable[_builtins.str] | None=..., root: Global___Library.NS | None=..., meta: _common_pb2.Metadata | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['id', b'id', 'meta', b'meta', 'root', b'root'] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['id', b'id', 'imports', b'imports', 'meta', b'meta', 'root', b'root'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___Library: _TypeAlias = Library @_typing.final class Design(_message.Message): """* This is a Design for an embedded system at some level of abstraction.""" - DESCRIPTOR: _descriptor.Descriptor CONTENTS_FIELD_NUMBER: _builtins.int @@ -187,12 +174,14 @@ class Design(_message.Message): def contents(self) -> _elem_pb2.HierarchyBlock: """* Delegate the actual contents of the design to a hierarchy block, for which ports are ignored""" - def __init__(self, *, contents: _elem_pb2.HierarchyBlock | None = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["contents", b"contents"] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["contents", b"contents"] + def __init__(self, *, contents: _elem_pb2.HierarchyBlock | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['contents', b'contents'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['contents', b'contents'] -Global___Design: _TypeAlias = Design + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... +Global___Design: _TypeAlias = Design \ No newline at end of file diff --git a/edg/edgrpc/compiler_pb2.py b/edg/edgrpc/compiler_pb2.py index a72494fbd..d70190500 100644 --- a/edg/edgrpc/compiler_pb2.py +++ b/edg/edgrpc/compiler_pb2.py @@ -1,21 +1,16 @@ """Generated protocol buffer code.""" - from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database - _sym_db = _symbol_database.Default() from ..edgir import schema_pb2 as edgir_dot_schema__pb2 from ..edgir import ref_pb2 as edgir_dot_ref__pb2 from ..edgir import lit_pb2 as edgir_dot_lit__pb2 from ..edgrpc import hdl_pb2 as edgrpc_dot_hdl__pb2 - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\x15edgrpc/compiler.proto\x12\x0fedgrpc.compiler\x1a\x12edgir/schema.proto\x1a\x0fedgir/ref.proto\x1a\x0fedgir/lit.proto\x1a\x10edgrpc/hdl.proto"^\n\x0bErrorRecord\x12"\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x0f\n\x07details\x18\x04 \x01(\t"e\n\x0fCompilerRequest\x12$\n\x06design\x18\x02 \x01(\x0b2\x14.edgir.schema.Design\x12,\n\x0brefinements\x18\x03 \x01(\x0b2\x17.edgrpc.hdl.Refinements"\xf2\x01\n\x0eCompilerResult\x12$\n\x06design\x18\x01 \x01(\x0b2\x14.edgir.schema.Design\x12,\n\x06errors\x18\x04 \x03(\x0b2\x1c.edgrpc.compiler.ErrorRecord\x12;\n\x0csolvedValues\x18\x02 \x03(\x0b2%.edgrpc.compiler.CompilerResult.Value\x1aO\n\x05Value\x12"\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12"\n\x05value\x18\x02 \x01(\x0b2\x13.edgir.lit.ValueLitb\x06proto3' -) +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15edgrpc/compiler.proto\x12\x0fedgrpc.compiler\x1a\x12edgir/schema.proto\x1a\x0fedgir/ref.proto\x1a\x0fedgir/lit.proto\x1a\x10edgrpc/hdl.proto"^\n\x0bErrorRecord\x12"\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x0f\n\x07details\x18\x04 \x01(\t"e\n\x0fCompilerRequest\x12$\n\x06design\x18\x02 \x01(\x0b2\x14.edgir.schema.Design\x12,\n\x0brefinements\x18\x03 \x01(\x0b2\x17.edgrpc.hdl.Refinements"\x94\x03\n\x0eCompilerResult\x12$\n\x06design\x18\x01 \x01(\x0b2\x14.edgir.schema.Design\x12,\n\x06errors\x18\x04 \x03(\x0b2\x1c.edgrpc.compiler.ErrorRecord\x12;\n\x0csolvedValues\x18\x02 \x03(\x0b2%.edgrpc.compiler.CompilerResult.Value\x12?\n\x0bconnections\x18\x03 \x03(\x0b2*.edgrpc.compiler.CompilerResult.Connection\x1aO\n\x05Value\x12"\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12"\n\x05value\x18\x02 \x01(\x0b2\x13.edgir.lit.ValueLit\x1a_\n\nConnection\x12(\n\nblock_port\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12\'\n\tlink_port\x18\x02 \x01(\x0b2\x14.edgir.ref.LocalPathb\x06proto3') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "edgrpc.compiler_pb2", globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'edgrpc.compiler_pb2', globals()) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None _ERRORRECORD._serialized_start = 114 @@ -23,6 +18,8 @@ _COMPILERREQUEST._serialized_start = 210 _COMPILERREQUEST._serialized_end = 311 _COMPILERRESULT._serialized_start = 314 - _COMPILERRESULT._serialized_end = 556 - _COMPILERRESULT_VALUE._serialized_start = 477 - _COMPILERRESULT_VALUE._serialized_end = 556 + _COMPILERRESULT._serialized_end = 718 + _COMPILERRESULT_VALUE._serialized_start = 542 + _COMPILERRESULT_VALUE._serialized_end = 621 + _COMPILERRESULT_CONNECTION._serialized_start = 623 + _COMPILERRESULT_CONNECTION._serialized_end = 718 \ No newline at end of file diff --git a/edg/edgrpc/compiler_pb2.pyi b/edg/edgrpc/compiler_pb2.pyi index 88dd418b3..4937795ad 100644 --- a/edg/edgrpc/compiler_pb2.pyi +++ b/edg/edgrpc/compiler_pb2.pyi @@ -6,7 +6,6 @@ Interface to the HDL (eg, library fetch) is not included here. This no longer uses gRPC to avoid complexity of sockets. """ - from collections import abc as _abc from edgir import lit_pb2 as _lit_pb2 from edgir import ref_pb2 as _ref_pb2 @@ -18,7 +17,6 @@ from google.protobuf.internal import containers as _containers import builtins as _builtins import sys import typing as _typing - if sys.version_info >= (3, 10): from typing import TypeAlias as _TypeAlias else: @@ -33,33 +31,26 @@ class ErrorRecord(_message.Message): NAME_FIELD_NUMBER: _builtins.int DETAILS_FIELD_NUMBER: _builtins.int kind: _builtins.str - "kind of error, eg failed to generate" + 'kind of error, eg failed to generate' name: _builtins.str - "constraint name / short description" + 'constraint name / short description' details: _builtins.str - "longer description, optional" + 'longer description, optional' @_builtins.property def path(self) -> _ref_pb2.LocalPath: """link / block / port, cannot be the constraint""" - def __init__( - self, - *, - path: _ref_pb2.LocalPath | None = ..., - kind: _builtins.str = ..., - name: _builtins.str = ..., - details: _builtins.str = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["path", b"path"] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "details", b"details", "kind", b"kind", "name", b"name", "path", b"path" - ] + def __init__(self, *, path: _ref_pb2.LocalPath | None=..., kind: _builtins.str=..., name: _builtins.str=..., details: _builtins.str=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['path', b'path'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['details', b'details', 'kind', b'kind', 'name', b'name', 'path', b'path'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___ErrorRecord: _TypeAlias = ErrorRecord @_typing.final @@ -69,19 +60,23 @@ class CompilerRequest(_message.Message): REFINEMENTS_FIELD_NUMBER: _builtins.int @_builtins.property - def design(self) -> _schema_pb2.Design: ... + def design(self) -> _schema_pb2.Design: + ... + @_builtins.property - def refinements(self) -> _hdl_pb2.Refinements: ... - def __init__( - self, *, design: _schema_pb2.Design | None = ..., refinements: _hdl_pb2.Refinements | None = ... - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["design", b"design", "refinements", b"refinements"] + def refinements(self) -> _hdl_pb2.Refinements: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["design", b"design", "refinements", b"refinements"] + def __init__(self, *, design: _schema_pb2.Design | None=..., refinements: _hdl_pb2.Refinements | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['design', b'design', 'refinements', b'refinements'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['design', b'design', 'refinements', b'refinements'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___CompilerRequest: _TypeAlias = CompilerRequest @_typing.final @@ -95,41 +90,78 @@ class CompilerResult(_message.Message): VALUE_FIELD_NUMBER: _builtins.int @_builtins.property - def path(self) -> _ref_pb2.LocalPath: ... + def path(self) -> _ref_pb2.LocalPath: + ... + + @_builtins.property + def value(self) -> _lit_pb2.ValueLit: + ... + + def __init__(self, *, path: _ref_pb2.LocalPath | None=..., value: _lit_pb2.ValueLit | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['path', b'path', 'value', b'value'] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['path', b'path', 'value', b'value'] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... + + @_typing.final + class Connection(_message.Message): + """from block ports to fully resolved (bypassing exports) links, including inner ports""" + DESCRIPTOR: _descriptor.Descriptor + BLOCK_PORT_FIELD_NUMBER: _builtins.int + LINK_PORT_FIELD_NUMBER: _builtins.int + + @_builtins.property + def block_port(self) -> _ref_pb2.LocalPath: + ... + @_builtins.property - def value(self) -> _lit_pb2.ValueLit: ... - def __init__(self, *, path: _ref_pb2.LocalPath | None = ..., value: _lit_pb2.ValueLit | None = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["path", b"path", "value", b"value"] + def link_port(self) -> _ref_pb2.LocalPath: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["path", b"path", "value", b"value"] + def __init__(self, *, block_port: _ref_pb2.LocalPath | None=..., link_port: _ref_pb2.LocalPath | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['block_port', b'block_port', 'link_port', b'link_port'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['block_port', b'block_port', 'link_port', b'link_port'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... DESIGN_FIELD_NUMBER: _builtins.int ERRORS_FIELD_NUMBER: _builtins.int SOLVEDVALUES_FIELD_NUMBER: _builtins.int + CONNECTIONS_FIELD_NUMBER: _builtins.int @_builtins.property - def design(self) -> _schema_pb2.Design: ... + def design(self) -> _schema_pb2.Design: + ... + @_builtins.property - def errors(self) -> _containers.RepeatedCompositeFieldContainer[Global___ErrorRecord]: ... + def errors(self) -> _containers.RepeatedCompositeFieldContainer[Global___ErrorRecord]: + ... + @_builtins.property - def solvedValues(self) -> _containers.RepeatedCompositeFieldContainer[Global___CompilerResult.Value]: ... - def __init__( - self, - *, - design: _schema_pb2.Design | None = ..., - errors: _abc.Iterable[Global___ErrorRecord] | None = ..., - solvedValues: _abc.Iterable[Global___CompilerResult.Value] | None = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["design", b"design"] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "design", b"design", "errors", b"errors", "solvedValues", b"solvedValues" - ] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - -Global___CompilerResult: _TypeAlias = CompilerResult + def solvedValues(self) -> _containers.RepeatedCompositeFieldContainer[Global___CompilerResult.Value]: + ... + + @_builtins.property + def connections(self) -> _containers.RepeatedCompositeFieldContainer[Global___CompilerResult.Connection]: + ... + + def __init__(self, *, design: _schema_pb2.Design | None=..., errors: _abc.Iterable[Global___ErrorRecord] | None=..., solvedValues: _abc.Iterable[Global___CompilerResult.Value] | None=..., connections: _abc.Iterable[Global___CompilerResult.Connection] | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['design', b'design'] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['connections', b'connections', 'design', b'design', 'errors', b'errors', 'solvedValues', b'solvedValues'] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... +Global___CompilerResult: _TypeAlias = CompilerResult \ No newline at end of file diff --git a/edg/edgrpc/hdl_pb2.py b/edg/edgrpc/hdl_pb2.py index 97b2a4a65..499d3c6e4 100644 --- a/edg/edgrpc/hdl_pb2.py +++ b/edg/edgrpc/hdl_pb2.py @@ -1,25 +1,20 @@ """Generated protocol buffer code.""" - from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database - _sym_db = _symbol_database.Default() from ..edgir import schema_pb2 as edgir_dot_schema__pb2 from ..edgir import ref_pb2 as edgir_dot_ref__pb2 from ..edgir import elem_pb2 as edgir_dot_elem__pb2 from ..edgir import lit_pb2 as edgir_dot_lit__pb2 - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\x10edgrpc/hdl.proto\x12\nedgrpc.hdl\x1a\x12edgir/schema.proto\x1a\x0fedgir/ref.proto\x1a\x10edgir/elem.proto\x1a\x0fedgir/lit.proto"\xb6\x04\n\x0bRefinements\x124\n\nsubclasses\x18\x01 \x03(\x0b2 .edgrpc.hdl.Refinements.Subclass\x12-\n\x06values\x18\x02 \x03(\x0b2\x1d.edgrpc.hdl.Refinements.Value\x1a\x8e\x01\n\x08Subclass\x12$\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPathH\x00\x12%\n\x03cls\x18\x02 \x01(\x0b2\x16.edgir.ref.LibraryPathH\x00\x12+\n\x0breplacement\x18\x03 \x01(\x0b2\x16.edgir.ref.LibraryPathB\x08\n\x06source\x1a\xb0\x02\n\x05Value\x12$\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPathH\x00\x12A\n\tcls_param\x18\x02 \x01(\x0b2,.edgrpc.hdl.Refinements.Value.ClassParamPathH\x00\x12#\n\x04expr\x18\x03 \x01(\x0b2\x13.edgir.lit.ValueLitH\x01\x12%\n\x05param\x18\x04 \x01(\x0b2\x14.edgir.ref.LocalPathH\x01\x1a_\n\x0eClassParamPath\x12#\n\x03cls\x18\x01 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12(\n\nparam_path\x18\x02 \x01(\x0b2\x14.edgir.ref.LocalPathB\x08\n\x06sourceB\x07\n\x05value"\x1a\n\nModuleName\x12\x0c\n\x04name\x18\x01 \x01(\t"8\n\rIndexResponse\x12\'\n\x07indexed\x18\x01 \x03(\x0b2\x16.edgir.ref.LibraryPath"9\n\x0eLibraryRequest\x12\'\n\x07element\x18\x02 \x01(\x0b2\x16.edgir.ref.LibraryPath"n\n\x0fLibraryResponse\x12-\n\x07element\x18\x01 \x01(\x0b2\x1c.edgir.schema.Library.NS.Val\x12,\n\x0brefinements\x18\x03 \x01(\x0b2\x17.edgrpc.hdl.Refinements"S\n\tExprValue\x12"\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12"\n\x05value\x18\x02 \x01(\x0b2\x13.edgir.lit.ValueLit"b\n\x10GeneratorRequest\x12\'\n\x07element\x18\x02 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12%\n\x06values\x18\x04 \x03(\x0b2\x15.edgrpc.hdl.ExprValue"B\n\x11GeneratorResponse\x12-\n\tgenerated\x18\x01 \x01(\x0b2\x1a.edgir.elem.HierarchyBlock"\x97\x01\n\x11RefinementRequest\x12/\n\x0frefinement_pass\x18\x01 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12$\n\x06design\x18\x02 \x01(\x0b2\x14.edgir.schema.Design\x12+\n\x0csolvedValues\x18\x03 \x03(\x0b2\x15.edgrpc.hdl.ExprValue">\n\x12RefinementResponse\x12(\n\tnewValues\x18\x01 \x03(\x0b2\x15.edgrpc.hdl.ExprValue"\xfc\x01\n\x0eBackendRequest\x12\'\n\x07backend\x18\x01 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12$\n\x06design\x18\x02 \x01(\x0b2\x14.edgir.schema.Design\x12+\n\x0csolvedValues\x18\x03 \x03(\x0b2\x15.edgrpc.hdl.ExprValue\x12<\n\targuments\x18\x04 \x03(\x0b2).edgrpc.hdl.BackendRequest.ArgumentsEntry\x1a0\n\x0eArgumentsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x028\x01"\x8e\x01\n\x0fBackendResponse\x123\n\x07results\x18\x01 \x03(\x0b2".edgrpc.hdl.BackendResponse.Result\x1aF\n\x06Result\x12"\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12\x0e\n\x04text\x18\x02 \x01(\tH\x00B\x08\n\x06result"1\n\rErrorResponse\x12\r\n\x05error\x18\x01 \x01(\t\x12\x11\n\ttraceback\x18\x02 \x01(\t"\xc8\x02\n\nHdlRequest\x12.\n\x0cindex_module\x18\x01 \x01(\x0b2\x16.edgrpc.hdl.ModuleNameH\x00\x129\n\x13get_library_element\x18\x02 \x01(\x0b2\x1a.edgrpc.hdl.LibraryRequestH\x00\x12;\n\x13elaborate_generator\x18\x03 \x01(\x0b2\x1c.edgrpc.hdl.GeneratorRequestH\x00\x127\n\x0erun_refinement\x18\x05 \x01(\x0b2\x1d.edgrpc.hdl.RefinementRequestH\x00\x121\n\x0brun_backend\x18\x04 \x01(\x0b2\x1a.edgrpc.hdl.BackendRequestH\x00\x12\x1b\n\x11get_proto_version\x18Z \x01(\rH\x00B\t\n\x07request"\xfd\x02\n\x0bHdlResponse\x121\n\x0cindex_module\x18\x01 \x01(\x0b2\x19.edgrpc.hdl.IndexResponseH\x00\x12:\n\x13get_library_element\x18\x02 \x01(\x0b2\x1b.edgrpc.hdl.LibraryResponseH\x00\x12<\n\x13elaborate_generator\x18\x03 \x01(\x0b2\x1d.edgrpc.hdl.GeneratorResponseH\x00\x128\n\x0erun_refinement\x18\x05 \x01(\x0b2\x1e.edgrpc.hdl.RefinementResponseH\x00\x122\n\x0brun_backend\x18\x04 \x01(\x0b2\x1b.edgrpc.hdl.BackendResponseH\x00\x12\x1b\n\x11get_proto_version\x18Z \x01(\rH\x00\x12*\n\x05error\x18c \x01(\x0b2\x19.edgrpc.hdl.ErrorResponseH\x00B\n\n\x08responseb\x06proto3' -) +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10edgrpc/hdl.proto\x12\nedgrpc.hdl\x1a\x12edgir/schema.proto\x1a\x0fedgir/ref.proto\x1a\x10edgir/elem.proto\x1a\x0fedgir/lit.proto"\xb6\x04\n\x0bRefinements\x124\n\nsubclasses\x18\x01 \x03(\x0b2 .edgrpc.hdl.Refinements.Subclass\x12-\n\x06values\x18\x02 \x03(\x0b2\x1d.edgrpc.hdl.Refinements.Value\x1a\x8e\x01\n\x08Subclass\x12$\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPathH\x00\x12%\n\x03cls\x18\x02 \x01(\x0b2\x16.edgir.ref.LibraryPathH\x00\x12+\n\x0breplacement\x18\x03 \x01(\x0b2\x16.edgir.ref.LibraryPathB\x08\n\x06source\x1a\xb0\x02\n\x05Value\x12$\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPathH\x00\x12A\n\tcls_param\x18\x02 \x01(\x0b2,.edgrpc.hdl.Refinements.Value.ClassParamPathH\x00\x12#\n\x04expr\x18\x03 \x01(\x0b2\x13.edgir.lit.ValueLitH\x01\x12%\n\x05param\x18\x04 \x01(\x0b2\x14.edgir.ref.LocalPathH\x01\x1a_\n\x0eClassParamPath\x12#\n\x03cls\x18\x01 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12(\n\nparam_path\x18\x02 \x01(\x0b2\x14.edgir.ref.LocalPathB\x08\n\x06sourceB\x07\n\x05value"\x1a\n\nModuleName\x12\x0c\n\x04name\x18\x01 \x01(\t"8\n\rIndexResponse\x12\'\n\x07indexed\x18\x01 \x03(\x0b2\x16.edgir.ref.LibraryPath"9\n\x0eLibraryRequest\x12\'\n\x07element\x18\x02 \x01(\x0b2\x16.edgir.ref.LibraryPath"n\n\x0fLibraryResponse\x12-\n\x07element\x18\x01 \x01(\x0b2\x1c.edgir.schema.Library.NS.Val\x12,\n\x0brefinements\x18\x03 \x01(\x0b2\x17.edgrpc.hdl.Refinements"S\n\tExprValue\x12"\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12"\n\x05value\x18\x02 \x01(\x0b2\x13.edgir.lit.ValueLit"b\n\x10GeneratorRequest\x12\'\n\x07element\x18\x02 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12%\n\x06values\x18\x04 \x03(\x0b2\x15.edgrpc.hdl.ExprValue"B\n\x11GeneratorResponse\x12-\n\tgenerated\x18\x01 \x01(\x0b2\x1a.edgir.elem.HierarchyBlock"\x97\x01\n\x11RefinementRequest\x12/\n\x0frefinement_pass\x18\x01 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12$\n\x06design\x18\x02 \x01(\x0b2\x14.edgir.schema.Design\x12+\n\x0csolvedValues\x18\x03 \x03(\x0b2\x15.edgrpc.hdl.ExprValue">\n\x12RefinementResponse\x12(\n\tnewValues\x18\x01 \x03(\x0b2\x15.edgrpc.hdl.ExprValue"\xfc\x01\n\x0eBackendRequest\x12\'\n\x07backend\x18\x01 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12$\n\x06design\x18\x02 \x01(\x0b2\x14.edgir.schema.Design\x12+\n\x0csolvedValues\x18\x03 \x03(\x0b2\x15.edgrpc.hdl.ExprValue\x12<\n\targuments\x18\x04 \x03(\x0b2).edgrpc.hdl.BackendRequest.ArgumentsEntry\x1a0\n\x0eArgumentsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x028\x01"\x8e\x01\n\x0fBackendResponse\x123\n\x07results\x18\x01 \x03(\x0b2".edgrpc.hdl.BackendResponse.Result\x1aF\n\x06Result\x12"\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12\x0e\n\x04text\x18\x02 \x01(\tH\x00B\x08\n\x06result"1\n\rErrorResponse\x12\r\n\x05error\x18\x01 \x01(\t\x12\x11\n\ttraceback\x18\x02 \x01(\t"\xc8\x02\n\nHdlRequest\x12.\n\x0cindex_module\x18\x01 \x01(\x0b2\x16.edgrpc.hdl.ModuleNameH\x00\x129\n\x13get_library_element\x18\x02 \x01(\x0b2\x1a.edgrpc.hdl.LibraryRequestH\x00\x12;\n\x13elaborate_generator\x18\x03 \x01(\x0b2\x1c.edgrpc.hdl.GeneratorRequestH\x00\x127\n\x0erun_refinement\x18\x05 \x01(\x0b2\x1d.edgrpc.hdl.RefinementRequestH\x00\x121\n\x0brun_backend\x18\x04 \x01(\x0b2\x1a.edgrpc.hdl.BackendRequestH\x00\x12\x1b\n\x11get_proto_version\x18Z \x01(\rH\x00B\t\n\x07request"\xfd\x02\n\x0bHdlResponse\x121\n\x0cindex_module\x18\x01 \x01(\x0b2\x19.edgrpc.hdl.IndexResponseH\x00\x12:\n\x13get_library_element\x18\x02 \x01(\x0b2\x1b.edgrpc.hdl.LibraryResponseH\x00\x12<\n\x13elaborate_generator\x18\x03 \x01(\x0b2\x1d.edgrpc.hdl.GeneratorResponseH\x00\x128\n\x0erun_refinement\x18\x05 \x01(\x0b2\x1e.edgrpc.hdl.RefinementResponseH\x00\x122\n\x0brun_backend\x18\x04 \x01(\x0b2\x1b.edgrpc.hdl.BackendResponseH\x00\x12\x1b\n\x11get_proto_version\x18Z \x01(\rH\x00\x12*\n\x05error\x18c \x01(\x0b2\x19.edgrpc.hdl.ErrorResponseH\x00B\n\n\x08responseb\x06proto3') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "edgrpc.hdl_pb2", globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'edgrpc.hdl_pb2', globals()) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None _BACKENDREQUEST_ARGUMENTSENTRY._options = None - _BACKENDREQUEST_ARGUMENTSENTRY._serialized_options = b"8\x01" + _BACKENDREQUEST_ARGUMENTSENTRY._serialized_options = b'8\x01' _REFINEMENTS._serialized_start = 105 _REFINEMENTS._serialized_end = 671 _REFINEMENTS_SUBCLASS._serialized_start = 222 @@ -59,4 +54,4 @@ _HDLREQUEST._serialized_start = 1853 _HDLREQUEST._serialized_end = 2181 _HDLRESPONSE._serialized_start = 2184 - _HDLRESPONSE._serialized_end = 2565 + _HDLRESPONSE._serialized_end = 2565 \ No newline at end of file diff --git a/edg/edgrpc/hdl_pb2.pyi b/edg/edgrpc/hdl_pb2.pyi index 6f22f752f..14ede7317 100644 --- a/edg/edgrpc/hdl_pb2.pyi +++ b/edg/edgrpc/hdl_pb2.pyi @@ -4,7 +4,6 @@ isort:skip_file * Defines messages for a service provided in Python that exposes HDL-to-edgir elaboration for a compiler in a different process / language. """ - from collections import abc as _abc from edgir import elem_pb2 as _elem_pb2 from edgir import lit_pb2 as _lit_pb2 @@ -16,7 +15,6 @@ from google.protobuf.internal import containers as _containers import builtins as _builtins import sys import typing as _typing - if sys.version_info >= (3, 10): from typing import TypeAlias as _TypeAlias else: @@ -35,32 +33,32 @@ class Refinements(_message.Message): REPLACEMENT_FIELD_NUMBER: _builtins.int @_builtins.property - def path(self) -> _ref_pb2.LocalPath: ... + def path(self) -> _ref_pb2.LocalPath: + ... + @_builtins.property - def cls(self) -> _ref_pb2.LibraryPath: ... + def cls(self) -> _ref_pb2.LibraryPath: + ... + @_builtins.property - def replacement(self) -> _ref_pb2.LibraryPath: ... - def __init__( - self, - *, - path: _ref_pb2.LocalPath | None = ..., - cls: _ref_pb2.LibraryPath | None = ..., - replacement: _ref_pb2.LibraryPath | None = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal[ - "cls", b"cls", "path", b"path", "replacement", b"replacement", "source", b"source" - ] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "cls", b"cls", "path", b"path", "replacement", b"replacement", "source", b"source" - ] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - _WhichOneofReturnType_source: _TypeAlias = _typing.Literal["path", "cls"] - _WhichOneofArgType_source: _TypeAlias = _typing.Literal["source", b"source"] - - def WhichOneof(self, oneof_group: _WhichOneofArgType_source) -> _WhichOneofReturnType_source | None: ... + def replacement(self) -> _ref_pb2.LibraryPath: + ... + + def __init__(self, *, path: _ref_pb2.LocalPath | None=..., cls: _ref_pb2.LibraryPath | None=..., replacement: _ref_pb2.LibraryPath | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['cls', b'cls', 'path', b'path', 'replacement', b'replacement', 'source', b'source'] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['cls', b'cls', 'path', b'path', 'replacement', b'replacement', 'source', b'source'] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... + _WhichOneofReturnType_source: _TypeAlias = _typing.Literal['path', 'cls'] + _WhichOneofArgType_source: _TypeAlias = _typing.Literal['source', b'source'] + + def WhichOneof(self, oneof_group: _WhichOneofArgType_source) -> _WhichOneofReturnType_source | None: + ... @_typing.final class Value(_message.Message): @@ -73,28 +71,36 @@ class Refinements(_message.Message): PARAM_PATH_FIELD_NUMBER: _builtins.int @_builtins.property - def cls(self) -> _ref_pb2.LibraryPath: ... + def cls(self) -> _ref_pb2.LibraryPath: + ... + @_builtins.property - def param_path(self) -> _ref_pb2.LocalPath: ... - def __init__( - self, *, cls: _ref_pb2.LibraryPath | None = ..., param_path: _ref_pb2.LocalPath | None = ... - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["cls", b"cls", "param_path", b"param_path"] + def param_path(self) -> _ref_pb2.LocalPath: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["cls", b"cls", "param_path", b"param_path"] + def __init__(self, *, cls: _ref_pb2.LibraryPath | None=..., param_path: _ref_pb2.LocalPath | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['cls', b'cls', 'param_path', b'param_path'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['cls', b'cls', 'param_path', b'param_path'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... PATH_FIELD_NUMBER: _builtins.int CLS_PARAM_FIELD_NUMBER: _builtins.int EXPR_FIELD_NUMBER: _builtins.int PARAM_FIELD_NUMBER: _builtins.int @_builtins.property - def path(self) -> _ref_pb2.LocalPath: ... + def path(self) -> _ref_pb2.LocalPath: + ... + @_builtins.property - def cls_param(self) -> Global___Refinements.Value.ClassParamPath: ... + def cls_param(self) -> Global___Refinements.Value.ClassParamPath: + ... + @_builtins.property def expr(self) -> _lit_pb2.ValueLit: """set to a specific value""" @@ -103,73 +109,45 @@ class Refinements(_message.Message): def param(self) -> _ref_pb2.LocalPath: """set to a value of another parameter - invalid for classes for now""" - def __init__( - self, - *, - path: _ref_pb2.LocalPath | None = ..., - cls_param: Global___Refinements.Value.ClassParamPath | None = ..., - expr: _lit_pb2.ValueLit | None = ..., - param: _ref_pb2.LocalPath | None = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal[ - "cls_param", - b"cls_param", - "expr", - b"expr", - "param", - b"param", - "path", - b"path", - "source", - b"source", - "value", - b"value", - ] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "cls_param", - b"cls_param", - "expr", - b"expr", - "param", - b"param", - "path", - b"path", - "source", - b"source", - "value", - b"value", - ] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - _WhichOneofReturnType_source: _TypeAlias = _typing.Literal["path", "cls_param"] - _WhichOneofArgType_source: _TypeAlias = _typing.Literal["source", b"source"] - _WhichOneofReturnType_value: _TypeAlias = _typing.Literal["expr", "param"] - _WhichOneofArgType_value: _TypeAlias = _typing.Literal["value", b"value"] + def __init__(self, *, path: _ref_pb2.LocalPath | None=..., cls_param: Global___Refinements.Value.ClassParamPath | None=..., expr: _lit_pb2.ValueLit | None=..., param: _ref_pb2.LocalPath | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['cls_param', b'cls_param', 'expr', b'expr', 'param', b'param', 'path', b'path', 'source', b'source', 'value', b'value'] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['cls_param', b'cls_param', 'expr', b'expr', 'param', b'param', 'path', b'path', 'source', b'source', 'value', b'value'] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... + _WhichOneofReturnType_source: _TypeAlias = _typing.Literal['path', 'cls_param'] + _WhichOneofArgType_source: _TypeAlias = _typing.Literal['source', b'source'] + _WhichOneofReturnType_value: _TypeAlias = _typing.Literal['expr', 'param'] + _WhichOneofArgType_value: _TypeAlias = _typing.Literal['value', b'value'] @_typing.overload - def WhichOneof(self, oneof_group: _WhichOneofArgType_source) -> _WhichOneofReturnType_source | None: ... - @_typing.overload - def WhichOneof(self, oneof_group: _WhichOneofArgType_value) -> _WhichOneofReturnType_value | None: ... + def WhichOneof(self, oneof_group: _WhichOneofArgType_source) -> _WhichOneofReturnType_source | None: + ... + @_typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType_value) -> _WhichOneofReturnType_value | None: + ... SUBCLASSES_FIELD_NUMBER: _builtins.int VALUES_FIELD_NUMBER: _builtins.int @_builtins.property - def subclasses(self) -> _containers.RepeatedCompositeFieldContainer[Global___Refinements.Subclass]: ... + def subclasses(self) -> _containers.RepeatedCompositeFieldContainer[Global___Refinements.Subclass]: + ... + @_builtins.property - def values(self) -> _containers.RepeatedCompositeFieldContainer[Global___Refinements.Value]: ... - def __init__( - self, - *, - subclasses: _abc.Iterable[Global___Refinements.Subclass] | None = ..., - values: _abc.Iterable[Global___Refinements.Value] | None = ..., - ) -> None: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["subclasses", b"subclasses", "values", b"values"] + def values(self) -> _containers.RepeatedCompositeFieldContainer[Global___Refinements.Value]: + ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def __init__(self, *, subclasses: _abc.Iterable[Global___Refinements.Subclass] | None=..., values: _abc.Iterable[Global___Refinements.Value] | None=...) -> None: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['subclasses', b'subclasses', 'values', b'values'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___Refinements: _TypeAlias = Refinements @_typing.final @@ -178,11 +156,12 @@ class ModuleName(_message.Message): NAME_FIELD_NUMBER: _builtins.int name: _builtins.str - def __init__(self, *, name: _builtins.str = ...) -> None: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["name", b"name"] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def __init__(self, *, name: _builtins.str=...) -> None: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['name', b'name'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___ModuleName: _TypeAlias = ModuleName @_typing.final @@ -191,12 +170,15 @@ class IndexResponse(_message.Message): INDEXED_FIELD_NUMBER: _builtins.int @_builtins.property - def indexed(self) -> _containers.RepeatedCompositeFieldContainer[_ref_pb2.LibraryPath]: ... - def __init__(self, *, indexed: _abc.Iterable[_ref_pb2.LibraryPath] | None = ...) -> None: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["indexed", b"indexed"] + def indexed(self) -> _containers.RepeatedCompositeFieldContainer[_ref_pb2.LibraryPath]: + ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def __init__(self, *, indexed: _abc.Iterable[_ref_pb2.LibraryPath] | None=...) -> None: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['indexed', b'indexed'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___IndexResponse: _TypeAlias = IndexResponse @_typing.final @@ -208,14 +190,16 @@ class LibraryRequest(_message.Message): def element(self) -> _ref_pb2.LibraryPath: """library element asked for""" - def __init__(self, *, element: _ref_pb2.LibraryPath | None = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["element", b"element"] + def __init__(self, *, element: _ref_pb2.LibraryPath | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['element', b'element'] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["element", b"element"] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['element', b'element'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___LibraryRequest: _TypeAlias = LibraryRequest @_typing.final @@ -225,21 +209,23 @@ class LibraryResponse(_message.Message): REFINEMENTS_FIELD_NUMBER: _builtins.int @_builtins.property - def element(self) -> _schema_pb2.Library.NS.Val: ... + def element(self) -> _schema_pb2.Library.NS.Val: + ... + @_builtins.property def refinements(self) -> Global___Refinements: """only valid if element is a top-level block""" - def __init__( - self, *, element: _schema_pb2.Library.NS.Val | None = ..., refinements: Global___Refinements | None = ... - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["element", b"element", "refinements", b"refinements"] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["element", b"element", "refinements", b"refinements"] + def __init__(self, *, element: _schema_pb2.Library.NS.Val | None=..., refinements: Global___Refinements | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['element', b'element', 'refinements', b'refinements'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['element', b'element', 'refinements', b'refinements'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___LibraryResponse: _TypeAlias = LibraryResponse @_typing.final @@ -249,17 +235,23 @@ class ExprValue(_message.Message): VALUE_FIELD_NUMBER: _builtins.int @_builtins.property - def path(self) -> _ref_pb2.LocalPath: ... + def path(self) -> _ref_pb2.LocalPath: + ... + @_builtins.property - def value(self) -> _lit_pb2.ValueLit: ... - def __init__(self, *, path: _ref_pb2.LocalPath | None = ..., value: _lit_pb2.ValueLit | None = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["path", b"path", "value", b"value"] + def value(self) -> _lit_pb2.ValueLit: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["path", b"path", "value", b"value"] + def __init__(self, *, path: _ref_pb2.LocalPath | None=..., value: _lit_pb2.ValueLit | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['path', b'path', 'value', b'value'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['path', b'path', 'value', b'value'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___ExprValue: _TypeAlias = ExprValue @_typing.final @@ -273,17 +265,19 @@ class GeneratorRequest(_message.Message): """path of library element containing the generator""" @_builtins.property - def values(self) -> _containers.RepeatedCompositeFieldContainer[Global___ExprValue]: ... - def __init__( - self, *, element: _ref_pb2.LibraryPath | None = ..., values: _abc.Iterable[Global___ExprValue] | None = ... - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["element", b"element"] + def values(self) -> _containers.RepeatedCompositeFieldContainer[Global___ExprValue]: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["element", b"element", "values", b"values"] + def __init__(self, *, element: _ref_pb2.LibraryPath | None=..., values: _abc.Iterable[Global___ExprValue] | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['element', b'element'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['element', b'element', 'values', b'values'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___GeneratorRequest: _TypeAlias = GeneratorRequest @_typing.final @@ -292,15 +286,19 @@ class GeneratorResponse(_message.Message): GENERATED_FIELD_NUMBER: _builtins.int @_builtins.property - def generated(self) -> _elem_pb2.HierarchyBlock: ... - def __init__(self, *, generated: _elem_pb2.HierarchyBlock | None = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["generated", b"generated"] + def generated(self) -> _elem_pb2.HierarchyBlock: + ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["generated", b"generated"] + def __init__(self, *, generated: _elem_pb2.HierarchyBlock | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['generated', b'generated'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['generated', b'generated'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___GeneratorResponse: _TypeAlias = GeneratorResponse @_typing.final @@ -308,34 +306,33 @@ class RefinementRequest(_message.Message): """Runs a refinement pass - something that takes a full design and solved values and generates additional values, eg for refdes assignment """ - DESCRIPTOR: _descriptor.Descriptor REFINEMENT_PASS_FIELD_NUMBER: _builtins.int DESIGN_FIELD_NUMBER: _builtins.int SOLVEDVALUES_FIELD_NUMBER: _builtins.int @_builtins.property - def refinement_pass(self) -> _ref_pb2.LibraryPath: ... + def refinement_pass(self) -> _ref_pb2.LibraryPath: + ... + @_builtins.property - def design(self) -> _schema_pb2.Design: ... + def design(self) -> _schema_pb2.Design: + ... + @_builtins.property - def solvedValues(self) -> _containers.RepeatedCompositeFieldContainer[Global___ExprValue]: ... - def __init__( - self, - *, - refinement_pass: _ref_pb2.LibraryPath | None = ..., - design: _schema_pb2.Design | None = ..., - solvedValues: _abc.Iterable[Global___ExprValue] | None = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["design", b"design", "refinement_pass", b"refinement_pass"] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "design", b"design", "refinement_pass", b"refinement_pass", "solvedValues", b"solvedValues" - ] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def solvedValues(self) -> _containers.RepeatedCompositeFieldContainer[Global___ExprValue]: + ... + + def __init__(self, *, refinement_pass: _ref_pb2.LibraryPath | None=..., design: _schema_pb2.Design | None=..., solvedValues: _abc.Iterable[Global___ExprValue] | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['design', b'design', 'refinement_pass', b'refinement_pass'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['design', b'design', 'refinement_pass', b'refinement_pass', 'solvedValues', b'solvedValues'] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___RefinementRequest: _TypeAlias = RefinementRequest @_typing.final @@ -344,12 +341,15 @@ class RefinementResponse(_message.Message): NEWVALUES_FIELD_NUMBER: _builtins.int @_builtins.property - def newValues(self) -> _containers.RepeatedCompositeFieldContainer[Global___ExprValue]: ... - def __init__(self, *, newValues: _abc.Iterable[Global___ExprValue] | None = ...) -> None: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["newValues", b"newValues"] + def newValues(self) -> _containers.RepeatedCompositeFieldContainer[Global___ExprValue]: + ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def __init__(self, *, newValues: _abc.Iterable[Global___ExprValue] | None=...) -> None: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['newValues', b'newValues'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___RefinementResponse: _TypeAlias = RefinementResponse @_typing.final @@ -357,7 +357,6 @@ class BackendRequest(_message.Message): """Runs a backend - something that generates fabrication artifacts from a compiled design tree eg, generate KiCad netlist, or generate microcontroller firmware pinmap headers """ - DESCRIPTOR: _descriptor.Descriptor @_typing.final @@ -368,41 +367,43 @@ class BackendRequest(_message.Message): key: _builtins.str value: _builtins.str - def __init__(self, *, key: _builtins.str = ..., value: _builtins.str = ...) -> None: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["key", b"key", "value", b"value"] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def __init__(self, *, key: _builtins.str=..., value: _builtins.str=...) -> None: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['key', b'key', 'value', b'value'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... BACKEND_FIELD_NUMBER: _builtins.int DESIGN_FIELD_NUMBER: _builtins.int SOLVEDVALUES_FIELD_NUMBER: _builtins.int ARGUMENTS_FIELD_NUMBER: _builtins.int @_builtins.property - def backend(self) -> _ref_pb2.LibraryPath: ... + def backend(self) -> _ref_pb2.LibraryPath: + ... + @_builtins.property - def design(self) -> _schema_pb2.Design: ... + def design(self) -> _schema_pb2.Design: + ... + @_builtins.property - def solvedValues(self) -> _containers.RepeatedCompositeFieldContainer[Global___ExprValue]: ... + def solvedValues(self) -> _containers.RepeatedCompositeFieldContainer[Global___ExprValue]: + ... + @_builtins.property - def arguments(self) -> _containers.ScalarMap[_builtins.str, _builtins.str]: ... - def __init__( - self, - *, - backend: _ref_pb2.LibraryPath | None = ..., - design: _schema_pb2.Design | None = ..., - solvedValues: _abc.Iterable[Global___ExprValue] | None = ..., - arguments: _abc.Mapping[_builtins.str, _builtins.str] | None = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["backend", b"backend", "design", b"design"] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "arguments", b"arguments", "backend", b"backend", "design", b"design", "solvedValues", b"solvedValues" - ] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def arguments(self) -> _containers.ScalarMap[_builtins.str, _builtins.str]: + ... + + def __init__(self, *, backend: _ref_pb2.LibraryPath | None=..., design: _schema_pb2.Design | None=..., solvedValues: _abc.Iterable[Global___ExprValue] | None=..., arguments: _abc.Mapping[_builtins.str, _builtins.str] | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['backend', b'backend', 'design', b'design'] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['arguments', b'arguments', 'backend', b'backend', 'design', b'design', 'solvedValues', b'solvedValues'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___BackendRequest: _TypeAlias = BackendRequest @_typing.final @@ -415,50 +416,56 @@ class BackendResponse(_message.Message): PATH_FIELD_NUMBER: _builtins.int TEXT_FIELD_NUMBER: _builtins.int text: _builtins.str - "for now, only text supported, for KiCad netlisting" + 'for now, only text supported, for KiCad netlisting' @_builtins.property def path(self) -> _ref_pb2.LocalPath: """path of corresponding element in design tree""" - def __init__(self, *, path: _ref_pb2.LocalPath | None = ..., text: _builtins.str = ...) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["path", b"path", "result", b"result", "text", b"text"] + def __init__(self, *, path: _ref_pb2.LocalPath | None=..., text: _builtins.str=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['path', b'path', 'result', b'result', 'text', b'text'] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["path", b"path", "result", b"result", "text", b"text"] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['path', b'path', 'result', b'result', 'text', b'text'] - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - _WhichOneofReturnType_result: _TypeAlias = _typing.Literal["text"] - _WhichOneofArgType_result: _TypeAlias = _typing.Literal["result", b"result"] - - def WhichOneof(self, oneof_group: _WhichOneofArgType_result) -> _WhichOneofReturnType_result | None: ... + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... + _WhichOneofReturnType_result: _TypeAlias = _typing.Literal['text'] + _WhichOneofArgType_result: _TypeAlias = _typing.Literal['result', b'result'] + def WhichOneof(self, oneof_group: _WhichOneofArgType_result) -> _WhichOneofReturnType_result | None: + ... RESULTS_FIELD_NUMBER: _builtins.int @_builtins.property - def results(self) -> _containers.RepeatedCompositeFieldContainer[Global___BackendResponse.Result]: ... - def __init__(self, *, results: _abc.Iterable[Global___BackendResponse.Result] | None = ...) -> None: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["results", b"results"] + def results(self) -> _containers.RepeatedCompositeFieldContainer[Global___BackendResponse.Result]: + ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def __init__(self, *, results: _abc.Iterable[Global___BackendResponse.Result] | None=...) -> None: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['results', b'results'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___BackendResponse: _TypeAlias = BackendResponse @_typing.final class ErrorResponse(_message.Message): """catch all error response""" - DESCRIPTOR: _descriptor.Descriptor ERROR_FIELD_NUMBER: _builtins.int TRACEBACK_FIELD_NUMBER: _builtins.int error: _builtins.str traceback: _builtins.str - def __init__(self, *, error: _builtins.str = ..., traceback: _builtins.str = ...) -> None: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["error", b"error", "traceback", b"traceback"] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + def __init__(self, *, error: _builtins.str=..., traceback: _builtins.str=...) -> None: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['error', b'error', 'traceback', b'traceback'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... Global___ErrorResponse: _TypeAlias = ErrorResponse @_typing.final @@ -471,7 +478,7 @@ class HdlRequest(_message.Message): RUN_BACKEND_FIELD_NUMBER: _builtins.int GET_PROTO_VERSION_FIELD_NUMBER: _builtins.int get_proto_version: _builtins.int - "no data" + 'no data' @_builtins.property def index_module(self) -> Global___ModuleName: @@ -486,67 +493,28 @@ class HdlRequest(_message.Message): """returns the elaborated IR""" @_builtins.property - def run_refinement(self) -> Global___RefinementRequest: ... + def run_refinement(self) -> Global___RefinementRequest: + ... + @_builtins.property - def run_backend(self) -> Global___BackendRequest: ... - def __init__( - self, - *, - index_module: Global___ModuleName | None = ..., - get_library_element: Global___LibraryRequest | None = ..., - elaborate_generator: Global___GeneratorRequest | None = ..., - run_refinement: Global___RefinementRequest | None = ..., - run_backend: Global___BackendRequest | None = ..., - get_proto_version: _builtins.int = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal[ - "elaborate_generator", - b"elaborate_generator", - "get_library_element", - b"get_library_element", - "get_proto_version", - b"get_proto_version", - "index_module", - b"index_module", - "request", - b"request", - "run_backend", - b"run_backend", - "run_refinement", - b"run_refinement", - ] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "elaborate_generator", - b"elaborate_generator", - "get_library_element", - b"get_library_element", - "get_proto_version", - b"get_proto_version", - "index_module", - b"index_module", - "request", - b"request", - "run_backend", - b"run_backend", - "run_refinement", - b"run_refinement", - ] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - _WhichOneofReturnType_request: _TypeAlias = _typing.Literal[ - "index_module", - "get_library_element", - "elaborate_generator", - "run_refinement", - "run_backend", - "get_proto_version", - ] - _WhichOneofArgType_request: _TypeAlias = _typing.Literal["request", b"request"] - - def WhichOneof(self, oneof_group: _WhichOneofArgType_request) -> _WhichOneofReturnType_request | None: ... + def run_backend(self) -> Global___BackendRequest: + ... + + def __init__(self, *, index_module: Global___ModuleName | None=..., get_library_element: Global___LibraryRequest | None=..., elaborate_generator: Global___GeneratorRequest | None=..., run_refinement: Global___RefinementRequest | None=..., run_backend: Global___BackendRequest | None=..., get_proto_version: _builtins.int=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['elaborate_generator', b'elaborate_generator', 'get_library_element', b'get_library_element', 'get_proto_version', b'get_proto_version', 'index_module', b'index_module', 'request', b'request', 'run_backend', b'run_backend', 'run_refinement', b'run_refinement'] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['elaborate_generator', b'elaborate_generator', 'get_library_element', b'get_library_element', 'get_proto_version', b'get_proto_version', 'index_module', b'index_module', 'request', b'request', 'run_backend', b'run_backend', 'run_refinement', b'run_refinement'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... + _WhichOneofReturnType_request: _TypeAlias = _typing.Literal['index_module', 'get_library_element', 'elaborate_generator', 'run_refinement', 'run_backend', 'get_proto_version'] + _WhichOneofArgType_request: _TypeAlias = _typing.Literal['request', b'request'] + + def WhichOneof(self, oneof_group: _WhichOneofArgType_request) -> _WhichOneofReturnType_request | None: + ... Global___HdlRequest: _TypeAlias = HdlRequest @_typing.final @@ -566,77 +534,38 @@ class HdlResponse(_message.Message): """list of contained library elements""" @_builtins.property - def get_library_element(self) -> Global___LibraryResponse: ... + def get_library_element(self) -> Global___LibraryResponse: + ... + @_builtins.property - def elaborate_generator(self) -> Global___GeneratorResponse: ... + def elaborate_generator(self) -> Global___GeneratorResponse: + ... + @_builtins.property - def run_refinement(self) -> Global___RefinementResponse: ... + def run_refinement(self) -> Global___RefinementResponse: + ... + @_builtins.property - def run_backend(self) -> Global___BackendResponse: ... + def run_backend(self) -> Global___BackendResponse: + ... + @_builtins.property - def error(self) -> Global___ErrorResponse: ... - def __init__( - self, - *, - index_module: Global___IndexResponse | None = ..., - get_library_element: Global___LibraryResponse | None = ..., - elaborate_generator: Global___GeneratorResponse | None = ..., - run_refinement: Global___RefinementResponse | None = ..., - run_backend: Global___BackendResponse | None = ..., - get_proto_version: _builtins.int = ..., - error: Global___ErrorResponse | None = ..., - ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal[ - "elaborate_generator", - b"elaborate_generator", - "error", - b"error", - "get_library_element", - b"get_library_element", - "get_proto_version", - b"get_proto_version", - "index_module", - b"index_module", - "response", - b"response", - "run_backend", - b"run_backend", - "run_refinement", - b"run_refinement", - ] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal[ - "elaborate_generator", - b"elaborate_generator", - "error", - b"error", - "get_library_element", - b"get_library_element", - "get_proto_version", - b"get_proto_version", - "index_module", - b"index_module", - "response", - b"response", - "run_backend", - b"run_backend", - "run_refinement", - b"run_refinement", - ] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - _WhichOneofReturnType_response: _TypeAlias = _typing.Literal[ - "index_module", - "get_library_element", - "elaborate_generator", - "run_refinement", - "run_backend", - "get_proto_version", - "error", - ] - _WhichOneofArgType_response: _TypeAlias = _typing.Literal["response", b"response"] - - def WhichOneof(self, oneof_group: _WhichOneofArgType_response) -> _WhichOneofReturnType_response | None: ... - -Global___HdlResponse: _TypeAlias = HdlResponse + def error(self) -> Global___ErrorResponse: + ... + + def __init__(self, *, index_module: Global___IndexResponse | None=..., get_library_element: Global___LibraryResponse | None=..., elaborate_generator: Global___GeneratorResponse | None=..., run_refinement: Global___RefinementResponse | None=..., run_backend: Global___BackendResponse | None=..., get_proto_version: _builtins.int=..., error: Global___ErrorResponse | None=...) -> None: + ... + _HasFieldArgType: _TypeAlias = _typing.Literal['elaborate_generator', b'elaborate_generator', 'error', b'error', 'get_library_element', b'get_library_element', 'get_proto_version', b'get_proto_version', 'index_module', b'index_module', 'response', b'response', 'run_backend', b'run_backend', 'run_refinement', b'run_refinement'] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: + ... + _ClearFieldArgType: _TypeAlias = _typing.Literal['elaborate_generator', b'elaborate_generator', 'error', b'error', 'get_library_element', b'get_library_element', 'get_proto_version', b'get_proto_version', 'index_module', b'index_module', 'response', b'response', 'run_backend', b'run_backend', 'run_refinement', b'run_refinement'] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: + ... + _WhichOneofReturnType_response: _TypeAlias = _typing.Literal['index_module', 'get_library_element', 'elaborate_generator', 'run_refinement', 'run_backend', 'get_proto_version', 'error'] + _WhichOneofArgType_response: _TypeAlias = _typing.Literal['response', b'response'] + + def WhichOneof(self, oneof_group: _WhichOneofArgType_response) -> _WhichOneofReturnType_response | None: + ... +Global___HdlResponse: _TypeAlias = HdlResponse \ No newline at end of file diff --git a/proto/edgrpc/compiler.proto b/proto/edgrpc/compiler.proto index 58259d427..a1572e8fe 100644 --- a/proto/edgrpc/compiler.proto +++ b/proto/edgrpc/compiler.proto @@ -34,4 +34,10 @@ message CompilerResult { edgir.lit.ValueLit value = 2; } repeated Value solvedValues = 2; + + message Connection { // from block ports to fully resolved (bypassing exports) links, including inner ports + edgir.ref.LocalPath block_port = 1; + edgir.ref.LocalPath link_port = 2; + } + repeated Connection connections = 3; } From 2bfa8e7aaf0530368ed98e3d48e203011f191c50 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 25 Apr 2026 14:17:30 -0700 Subject: [PATCH 14/25] wip bump proto ver --- compiler/src/main/scala/edg/compiler/Compiler.scala | 2 +- compiler/src/main/scala/edg/compiler/CompilerServerMain.scala | 3 ++- edg/hdl_server/__main__.py | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/compiler/src/main/scala/edg/compiler/Compiler.scala b/compiler/src/main/scala/edg/compiler/Compiler.scala index 2d1114fe8..0e9e40435 100644 --- a/compiler/src/main/scala/edg/compiler/Compiler.scala +++ b/compiler/src/main/scala/edg/compiler/Compiler.scala @@ -117,7 +117,7 @@ class AssignNamer() { } object Compiler { - final val kExpectedProtoVersion = 9 + final val kExpectedProtoVersion = 10 } /** Compiler for a particular design, with an associated library to elaborate references from. diff --git a/compiler/src/main/scala/edg/compiler/CompilerServerMain.scala b/compiler/src/main/scala/edg/compiler/CompilerServerMain.scala index 97a6868c0..d9b5f1d95 100644 --- a/compiler/src/main/scala/edg/compiler/CompilerServerMain.scala +++ b/compiler/src/main/scala/edg/compiler/CompilerServerMain.scala @@ -52,7 +52,8 @@ object CompilerServerMain { val result = edgcompiler.CompilerResult( design = Some(compiled), errors = errors.map(_.toIr), - solvedValues = constPropToSolved(compiler.getAllSolved) + solvedValues = constPropToSolved(compiler.getAllSolved), + connections = Vector() ) result } catch { diff --git a/edg/hdl_server/__main__.py b/edg/hdl_server/__main__.py index ecfc4bef1..eab75d46d 100644 --- a/edg/hdl_server/__main__.py +++ b/edg/hdl_server/__main__.py @@ -9,7 +9,7 @@ from ..core import * from ..core.Core import NonLibraryProperty -EDG_PROTO_VERSION = 9 +EDG_PROTO_VERSION = 10 class LibraryElementIndexer: From 92d9f7f6cad2187791dbd81a6fe653a3ee1cc04c Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 25 Apr 2026 14:30:50 -0700 Subject: [PATCH 15/25] plumb through to compiler --- compiler/src/main/scala/edg/compiler/Compiler.scala | 1 + .../main/scala/edg/compiler/CompilerServerMain.scala | 12 +++++++++++- compiler/src/main/scala/edg/compiler/ConstProp.scala | 4 ++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/compiler/src/main/scala/edg/compiler/Compiler.scala b/compiler/src/main/scala/edg/compiler/Compiler.scala index 0e9e40435..f91c4d7cb 100644 --- a/compiler/src/main/scala/edg/compiler/Compiler.scala +++ b/compiler/src/main/scala/edg/compiler/Compiler.scala @@ -1703,5 +1703,6 @@ class Compiler private ( def getParamType(param: IndirectDesignPath): Option[Class[_ <: ExprValue]] = constProp.getType(param) def getParamValue(param: IndirectDesignPath): Option[ExprValue] = constProp.getValue(param) def getAllSolved: Map[IndirectDesignPath, ExprValue] = constProp.getAllSolved + def getAllConnections: Map[DesignPath, DesignPath] = constProp.getAllConnections def getConnectedLink(port: DesignPath): Option[DesignPath] = constProp.getConnectedLink(port) } diff --git a/compiler/src/main/scala/edg/compiler/CompilerServerMain.scala b/compiler/src/main/scala/edg/compiler/CompilerServerMain.scala index d9b5f1d95..18a604649 100644 --- a/compiler/src/main/scala/edg/compiler/CompilerServerMain.scala +++ b/compiler/src/main/scala/edg/compiler/CompilerServerMain.scala @@ -42,6 +42,16 @@ object CompilerServerMain { }.toSeq } + private def constPropConnectionToConnection(vals: Map[DesignPath, DesignPath]) + : Seq[edgcompiler.CompilerResult.Connection] = { + vals.map { case (block, link) => + edgcompiler.CompilerResult.Connection( + blockPort = Some(block.asIndirect.toLocalPath), + linkPort = Some(link.asIndirect.toLocalPath) + ) + }.toSeq + } + def compile(request: CompilerRequest, library: PythonInterfaceLibrary): CompilerResult = { try { val refinements = Refinements(request.getRefinements) @@ -53,7 +63,7 @@ object CompilerServerMain { design = Some(compiled), errors = errors.map(_.toIr), solvedValues = constPropToSolved(compiler.getAllSolved), - connections = Vector() + connections = constPropConnectionToConnection(compiler.getAllConnections) ) result } catch { diff --git a/compiler/src/main/scala/edg/compiler/ConstProp.scala b/compiler/src/main/scala/edg/compiler/ConstProp.scala index 8d1d1c382..852bc3163 100644 --- a/compiler/src/main/scala/edg/compiler/ConstProp.scala +++ b/compiler/src/main/scala/edg/compiler/ConstProp.scala @@ -292,6 +292,10 @@ class ConstProp() { def getAllSolved: Map[IndirectDesignPath, ExprValue] = params.toMap + def getAllConnections: Map[DesignPath, DesignPath] = connectedLink.toMap.collect { + case (ConnectedLinkRecord.ConnectedLink(port), link) => port -> link + } + def getErrors: Seq[ExprError] = { paramErrors.flatMap { case (target, errors) => errors.map(error => ExprError(target, error.msg)) From 5aa5990b8e96c77b59269ab79d504b59e5998b92 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 25 Apr 2026 15:49:32 -0700 Subject: [PATCH 16/25] Update ScalaCompilerInterface.py --- edg/core/ScalaCompilerInterface.py | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/edg/core/ScalaCompilerInterface.py b/edg/core/ScalaCompilerInterface.py index 3580e7641..9254933ec 100644 --- a/edg/core/ScalaCompilerInterface.py +++ b/edg/core/ScalaCompilerInterface.py @@ -20,19 +20,30 @@ class CompilerCheckError(BaseException): class CompiledDesign: @staticmethod def from_compiler_result(result: edgrpc.CompilerResult) -> "CompiledDesign": - values = {value.path.SerializeToString(): edgir.valuelit_to_lit(value.value) for value in result.solvedValues} - return CompiledDesign(result.design, values, list(result.errors)) + connections = [(conn.block_port, conn.link_port) for conn in result.connections] + return CompiledDesign( + result.design, + [(value.path, value.value) for value in result.solvedValues], + connections, + list(result.errors), + ) @staticmethod def from_request(design: edgir.Design, values: Iterable[edgrpc.ExprValue]) -> "CompiledDesign": - values_dict = {value.path.SerializeToString(): edgir.valuelit_to_lit(value.value) for value in values} - return CompiledDesign(design, values_dict, []) - - def __init__(self, design: edgir.Design, values: Dict[bytes, edgir.LitTypes], errors: List[edgrpc.ErrorRecord]): + return CompiledDesign(design, [(value.path, value.value) for value in values], [], []) + + def __init__( + self, + design: edgir.Design, + values: List[Tuple[edgir.LocalPath, edgir.ValueLit]], + connections: List[Tuple[edgir.LocalPath, edgir.LocalPath]], + errors: List[edgrpc.ErrorRecord], + ): self.design = design self.contents = design.contents # convenience accessor self.errors = errors - self._values = values + self._values = {path.SerializeToString(): edgir.valuelit_to_lit(value) for path, value in values} + self._connections = connections def errors_str(self) -> str: err_strs = [] From b3db3cd54083176019828ac1865ace443c8c00c6 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 25 Apr 2026 17:12:35 -0700 Subject: [PATCH 17/25] store port-within-link --- .../src/main/scala/edg/compiler/ConstProp.scala | 15 +++++++++------ edg/core/CompiledDesignExport.py | 17 ++++++++++++++--- edg/core/FnTransformUtil.py | 6 +++--- edg/core/ScalaCompilerInterface.py | 7 ++++++- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/compiler/src/main/scala/edg/compiler/ConstProp.scala b/compiler/src/main/scala/edg/compiler/ConstProp.scala index 852bc3163..a3dd29d88 100644 --- a/compiler/src/main/scala/edg/compiler/ConstProp.scala +++ b/compiler/src/main/scala/edg/compiler/ConstProp.scala @@ -26,6 +26,9 @@ object ConnectedLinkResult { case class MissingConnectedLink(port: DesignPath) extends ConnectedLinkResult } +// for port connectivity, stores both the link path and the port (on the link) path +case class ConnectedLinkPort(link: DesignPath, port: DesignPath) + /** Parameter propagation, evaluation, and resolution associated with a single design. General philosophy: this should * not refer to any particular design instance, so the design can continue to be transformed (though those * transformations must be strictly additive with regards to assignments and assertions) @@ -48,7 +51,7 @@ class ConstProp() { // Undeclared parameters cannot have values set, but can be forced (though the value is not effective until declared) private val paramTypes = mutable.HashMap[IndirectDesignPath, Class[_ <: ExprValue]]() - private val connectedLink = DependencyGraph[ConnectedLinkRecord, DesignPath]() // tracks the port -> link paths + private val connectedLink = DependencyGraph[ConnectedLinkRecord, ConnectedLinkPort]() // tracks the port -> link paths // Params that have a forced/override value, so they arent over-assigned. private val forcedParams = mutable.Set[IndirectDesignPath]() @@ -80,7 +83,7 @@ class ConstProp() { case Some((connected, postfix)) => connectedLink.getValue(ConnectedLinkRecord.ConnectedLink(connected)) match { case Some(connectedLinkPath) => - resolveConnectedLink(connectedLinkPath.asIndirect ++ postfix) + resolveConnectedLink(connectedLinkPath.link.asIndirect ++ postfix) case None => ConnectedLinkResult.MissingConnectedLink(connected) } @@ -104,7 +107,7 @@ class ConstProp() { params.setValue(port.asIndirect + IndirectStep.ConnectedLink, BooleanValue(false)) // dummy value case _ => throw new IllegalArgumentException() } - connectedLink.setValue(ready, DesignPath()) + connectedLink.setValue(ready, ConnectedLinkPort(DesignPath(), DesignPath())) } var readyList = Iterable[IndirectDesignPath]() @@ -164,7 +167,7 @@ class ConstProp() { } def setConnectedLink(linkPath: DesignPath, portPath: DesignPath): Unit = { - connectedLink.setValue(ConnectedLinkRecord.ConnectedLink(portPath), linkPath) + connectedLink.setValue(ConnectedLinkRecord.ConnectedLink(portPath), ConnectedLinkPort(linkPath, portPath)) params.setValue(portPath.asIndirect + IndirectStep.ConnectedLink, BooleanValue(false)) // dummy value update() @@ -274,7 +277,7 @@ class ConstProp() { } def getConnectedLink(port: DesignPath): Option[DesignPath] = { - connectedLink.getValue(ConnectedLinkRecord.ConnectedLink(port)) + connectedLink.getValue(ConnectedLinkRecord.ConnectedLink(port)).map(_.link) } /** Returns the type (as a class of ExprValue) of a parameter. @@ -293,7 +296,7 @@ class ConstProp() { def getAllSolved: Map[IndirectDesignPath, ExprValue] = params.toMap def getAllConnections: Map[DesignPath, DesignPath] = connectedLink.toMap.collect { - case (ConnectedLinkRecord.ConnectedLink(port), link) => port -> link + case (ConnectedLinkRecord.ConnectedLink(blockPort), ConnectedLinkPort(_, linkPort)) => blockPort -> linkPort } def getErrors: Seq[ExprError] = { diff --git a/edg/core/CompiledDesignExport.py b/edg/core/CompiledDesignExport.py index 31d28aa7e..f204aaf9d 100644 --- a/edg/core/CompiledDesignExport.py +++ b/edg/core/CompiledDesignExport.py @@ -30,7 +30,7 @@ class CompiledPort(BaseModel): # path of connected port, if connected # for block ports, this is either the link port or the exported port # for link ports, this is the block port - connected_path: Optional[List[PathType]] + connected_path: Optional[PathType] params: Dict[str, CompiledParam] ports: Dict[str, "CompiledPort"] @@ -64,6 +64,10 @@ class CompiledDesignExportTransform(FnTransformBase[CompiledPort, CompiledBlock, def _path_to_path(path: Path) -> PathType: return ".".join(path.to_tuple()) + @staticmethod + def _localpath_to_path(localpath: edgir.LocalPath) -> PathType: + return ".".join(edgir.local_path_to_str_list(localpath)) + @staticmethod def _libpath_to_str(libpath: edgir.LibraryPath) -> str: return libpath.target.name @@ -80,7 +84,7 @@ def _param_to_compiled(self, path: Path, elt: edgir.ValInit) -> CompiledParam: if path.params[-1] in self._EXCLUDED_PARAM_VALUES: value: Optional[Any] = "" else: - value = self.design.get_value(path.to_local_path()) + value = self._design.get_value(path.to_local_path()) if isinstance(value, Range): # convert to Pydantic friendly # JSON can't encode inf / -inf by standard, so convert to strings if value == RangeExpr.EMPTY: @@ -140,10 +144,17 @@ def transform_port( else: params = {} + if not context.path.links: + connected_path: Optional[edgir.LocalPath] = self._design.get_connected_link_port( + context.path.to_local_path() + ) + else: + connected_path = None + return CompiledPort( path=self._path_to_path(context.path), cls=self._libpath_to_str(elt.self_class), - connected_path=None, # TODO IMPLEMENT ME + connected_path=self._localpath_to_path(connected_path) if connected_path is not None else None, params=params, ports=dict(ports), ) diff --git a/edg/core/FnTransformUtil.py b/edg/core/FnTransformUtil.py index 78e35e3cb..e5b894bd1 100644 --- a/edg/core/FnTransformUtil.py +++ b/edg/core/FnTransformUtil.py @@ -18,13 +18,13 @@ class FnTransformBase(Generic[TransformedPort, TransformedBlock, TransformedLink """ def __init__(self, design: CompiledDesign) -> None: - self.design = design + self._design = design def transform(self) -> TransformedBlock: """Entry point for the transform. Transforms the design and returns the result. Should only be called once per object, undefined behavior if called multiple times.""" - context = TransformContext(Path.empty(), self.design.contents) - return self.visit_block(context, self.design.contents) + context = TransformContext(Path.empty(), self._design.contents) + return self.visit_block(context, self._design.contents) def _visit_portlike(self, context: TransformContext, elt: edgir.PortLike) -> TransformedPort: if elt.HasField("port"): diff --git a/edg/core/ScalaCompilerInterface.py b/edg/core/ScalaCompilerInterface.py index 9254933ec..01dc19307 100644 --- a/edg/core/ScalaCompilerInterface.py +++ b/edg/core/ScalaCompilerInterface.py @@ -43,7 +43,8 @@ def __init__( self.contents = design.contents # convenience accessor self.errors = errors self._values = {path.SerializeToString(): edgir.valuelit_to_lit(value) for path, value in values} - self._connections = connections + self._block_to_link_ports = {block_port.SerializeToString(): link_port for block_port, link_port in connections} + # self._link_to_block_ports = {link_port.SerializeToString(): block_port for block_port, link_port in connections} def errors_str(self) -> str: err_strs = [] @@ -72,6 +73,10 @@ def append_values(self, values: List[Tuple[edgir.LocalPath, edgir.ValueLit]]) -> assert value_path_str not in self._values self._values[value_path_str] = edgir.valuelit_to_lit(value_value) + def get_connected_link_port(self, block_port: edgir.LocalPath) -> Optional[edgir.LocalPath]: + """For a block port, return the connected link side port.""" + return self._block_to_link_ports.get(block_port.SerializeToString()) + class ScalaCompilerInstance: kDevRelpath = "../../compiler/target/scala-2.13/edg-compiler-assembly-0.1-SNAPSHOT.jar" From 7076f627e333467ec120ccad51c4d2d6de29bb5c Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 25 Apr 2026 17:44:02 -0700 Subject: [PATCH 18/25] refactoring and cleanup --- .../main/scala/edg/compiler/Compiler.scala | 8 +- .../main/scala/edg/compiler/ConstProp.scala | 17 ++-- edg/core/CompiledDesignExport.py | 79 +++++++++++-------- edg/core/ScalaCompilerInterface.py | 9 ++- 4 files changed, 68 insertions(+), 45 deletions(-) diff --git a/compiler/src/main/scala/edg/compiler/Compiler.scala b/compiler/src/main/scala/edg/compiler/Compiler.scala index f91c4d7cb..8852f0788 100644 --- a/compiler/src/main/scala/edg/compiler/Compiler.scala +++ b/compiler/src/main/scala/edg/compiler/Compiler.scala @@ -1191,16 +1191,16 @@ class Compiler private ( val link = resolveLink(path).asInstanceOf[wir.Link] // TODO refactor this out, ConnectedLink needs to be centralized - def setConnectedLink(portPath: DesignPath, port: PortLike): Unit = (port: @unchecked) match { + def setConnectedLink(portSuffix: Seq[String], port: PortLike): Unit = (port: @unchecked) match { case _: wir.Port => - constProp.setConnectedLink(path, portPath) + constProp.setConnectedLink(path, portSuffix) case port: wir.PortArray => port.getPorts.foreach { case (subPortName, subPort) => - setConnectedLink(portPath + subPortName, subPort) + setConnectedLink(portSuffix ++ Seq(subPortName), subPort) } } for ((portName, port) <- link.getPorts) { - setConnectedLink(path + portName, port) + setConnectedLink(Seq(portName), port) } // Queue up sub-trees that need elaboration diff --git a/compiler/src/main/scala/edg/compiler/ConstProp.scala b/compiler/src/main/scala/edg/compiler/ConstProp.scala index a3dd29d88..06f848862 100644 --- a/compiler/src/main/scala/edg/compiler/ConstProp.scala +++ b/compiler/src/main/scala/edg/compiler/ConstProp.scala @@ -27,7 +27,7 @@ object ConnectedLinkResult { } // for port connectivity, stores both the link path and the port (on the link) path -case class ConnectedLinkPort(link: DesignPath, port: DesignPath) +case class ConnectedLinkPort(linkPath: DesignPath, portSuffix: Seq[String]) /** Parameter propagation, evaluation, and resolution associated with a single design. General philosophy: this should * not refer to any particular design instance, so the design can continue to be transformed (though those @@ -83,7 +83,7 @@ class ConstProp() { case Some((connected, postfix)) => connectedLink.getValue(ConnectedLinkRecord.ConnectedLink(connected)) match { case Some(connectedLinkPath) => - resolveConnectedLink(connectedLinkPath.link.asIndirect ++ postfix) + resolveConnectedLink(connectedLinkPath.linkPath.asIndirect ++ postfix) case None => ConnectedLinkResult.MissingConnectedLink(connected) } @@ -107,7 +107,7 @@ class ConstProp() { params.setValue(port.asIndirect + IndirectStep.ConnectedLink, BooleanValue(false)) // dummy value case _ => throw new IllegalArgumentException() } - connectedLink.setValue(ready, ConnectedLinkPort(DesignPath(), DesignPath())) + connectedLink.setValue(ready, ConnectedLinkPort(DesignPath(), Seq())) } var readyList = Iterable[IndirectDesignPath]() @@ -166,8 +166,9 @@ class ConstProp() { update() } - def setConnectedLink(linkPath: DesignPath, portPath: DesignPath): Unit = { - connectedLink.setValue(ConnectedLinkRecord.ConnectedLink(portPath), ConnectedLinkPort(linkPath, portPath)) + def setConnectedLink(linkPath: DesignPath, portSuffix: Seq[String]): Unit = { + val portPath = linkPath ++ portSuffix + connectedLink.setValue(ConnectedLinkRecord.ConnectedLink(portPath), ConnectedLinkPort(linkPath, portSuffix)) params.setValue(portPath.asIndirect + IndirectStep.ConnectedLink, BooleanValue(false)) // dummy value update() @@ -277,7 +278,7 @@ class ConstProp() { } def getConnectedLink(port: DesignPath): Option[DesignPath] = { - connectedLink.getValue(ConnectedLinkRecord.ConnectedLink(port)).map(_.link) + connectedLink.getValue(ConnectedLinkRecord.ConnectedLink(port)).map(_.linkPath) } /** Returns the type (as a class of ExprValue) of a parameter. @@ -296,7 +297,9 @@ class ConstProp() { def getAllSolved: Map[IndirectDesignPath, ExprValue] = params.toMap def getAllConnections: Map[DesignPath, DesignPath] = connectedLink.toMap.collect { - case (ConnectedLinkRecord.ConnectedLink(blockPort), ConnectedLinkPort(_, linkPort)) => blockPort -> linkPort + case (ConnectedLinkRecord.ConnectedLink(towardsBlockPort), ConnectedLinkPort(linkPath, linkPortSuffix)) + if towardsBlockPort != (linkPath ++ linkPortSuffix) => + towardsBlockPort -> (linkPath ++ linkPortSuffix) } def getErrors: Seq[ExprError] = { diff --git a/edg/core/CompiledDesignExport.py b/edg/core/CompiledDesignExport.py index f204aaf9d..3c68d0625 100644 --- a/edg/core/CompiledDesignExport.py +++ b/edg/core/CompiledDesignExport.py @@ -1,7 +1,7 @@ from typing import Optional, Dict, List, Any, Union, Mapping, Literal, override import re -from pydantic import BaseModel +from pydantic import BaseModel, RootModel from .. import edgir from .ConstraintExpr import RangeExpr @@ -20,26 +20,26 @@ class CompiledParam(BaseModel): value: Optional[Any] # solved value, if available -class CompiledPortArray(BaseModel): - ports: Dict[str, "CompiledPort"] +class CompiledPortArray(RootModel[Dict[str, Union["CompiledPort", "CompiledPortArray"]]]): + pass class CompiledPort(BaseModel): path: PathType # provide the full path to allow searchability cls: str # self class # path of connected port, if connected - # for block ports, this is either the link port or the exported port - # for link ports, this is the block port - connected_path: Optional[PathType] + # for block ports, this is the link, if connected to one + connected_path: Optional[Union[PathType, List[PathType]]] + # note, link ports do not have parameters (they inherit parameters from connected ports and are deduplicated here) params: Dict[str, CompiledParam] - ports: Dict[str, "CompiledPort"] + ports: Dict[str, Union["CompiledPort", CompiledPortArray]] class CompiledLink(BaseModel): path: PathType # provide the full path to allow searchability cls: str # self class params: Dict[str, CompiledParam] - ports: Dict[str, CompiledPort] + ports: Dict[str, Union[CompiledPortArray, CompiledPort]] links: Dict[str, "CompiledLink"] @@ -54,7 +54,9 @@ class CompiledBlock(BaseModel): # TODO: all constraints? -class CompiledDesignExportTransform(FnTransformBase[CompiledPort, CompiledBlock, CompiledLink]): +class CompiledDesignExportTransform( + FnTransformBase[Union[CompiledPort, CompiledPortArray], CompiledBlock, CompiledLink] +): """Transform a design into the CompiledBlock and friends data structure for export to a human-readable format.""" # these values are excluded since they're very large and not very useful @@ -111,7 +113,7 @@ def transform_block( self, context: TransformContext, elt: edgir.HierarchyBlock, - ports: Mapping[str, CompiledPort], + ports: Mapping[str, Union[CompiledPort, CompiledPortArray]], blocks: Mapping[str, CompiledBlock], links: Mapping[str, CompiledLink], ) -> CompiledBlock: @@ -134,37 +136,48 @@ def transform_port( self, context: TransformContext, elt: Union[edgir.Port, edgir.PortArray], - ports: Mapping[str, CompiledPort], - ) -> CompiledPort: + ports: Mapping[str, Union[CompiledPort, CompiledPortArray]], + ) -> Union[CompiledPort, CompiledPortArray]: if isinstance(elt, edgir.Port): - params = { - param_pair.name: self._param_to_compiled(context.path.append_param(param_pair.name), param_pair.value) - for param_pair in elt.params - } - else: - params = {} - - if not context.path.links: - connected_path: Optional[edgir.LocalPath] = self._design.get_connected_link_port( - context.path.to_local_path() + if not context.path.links: + params = { + param_pair.name: self._param_to_compiled( + context.path.append_param(param_pair.name), param_pair.value + ) + for param_pair in elt.params + } + else: + params = {} + + if not context.path.links: + link_path_opt = self._design.get_connected_link_port(context.path.to_local_path()) + if link_path_opt is not None: + connected_path: Optional[Union[PathType, List[PathType]]] = self._localpath_to_path(link_path_opt) + else: + connected_path = None + else: + block_paths_opt = self._design.get_connected_block_ports(context.path.to_local_path()) + if block_paths_opt is not None: + connected_path = [self._localpath_to_path(link_path) for link_path in block_paths_opt] + else: + connected_path = None + + return CompiledPort( + path=self._path_to_path(context.path), + cls=self._libpath_to_str(elt.self_class), + connected_path=connected_path, + params=params, + ports=dict(ports), ) - else: - connected_path = None - - return CompiledPort( - path=self._path_to_path(context.path), - cls=self._libpath_to_str(elt.self_class), - connected_path=self._localpath_to_path(connected_path) if connected_path is not None else None, - params=params, - ports=dict(ports), - ) + elif isinstance(elt, edgir.PortArray): + return CompiledPortArray(dict(ports)) @override def transform_link( self, context: TransformContext, elt: edgir.Link, - ports: Mapping[str, CompiledPort], + ports: Mapping[str, Union[CompiledPort, CompiledPortArray]], links: Mapping[str, CompiledLink], ) -> CompiledLink: return CompiledLink( diff --git a/edg/core/ScalaCompilerInterface.py b/edg/core/ScalaCompilerInterface.py index 01dc19307..47cfffc07 100644 --- a/edg/core/ScalaCompilerInterface.py +++ b/edg/core/ScalaCompilerInterface.py @@ -44,7 +44,10 @@ def __init__( self.errors = errors self._values = {path.SerializeToString(): edgir.valuelit_to_lit(value) for path, value in values} self._block_to_link_ports = {block_port.SerializeToString(): link_port for block_port, link_port in connections} - # self._link_to_block_ports = {link_port.SerializeToString(): block_port for block_port, link_port in connections} + self._link_to_block_ports: Dict[bytes, List[edgir.LocalPath]] = {} + for block_port, link_port in connections: + link_port_str = link_port.SerializeToString() + self._link_to_block_ports.setdefault(link_port_str, []).append(block_port) def errors_str(self) -> str: err_strs = [] @@ -77,6 +80,10 @@ def get_connected_link_port(self, block_port: edgir.LocalPath) -> Optional[edgir """For a block port, return the connected link side port.""" return self._block_to_link_ports.get(block_port.SerializeToString()) + def get_connected_block_ports(self, link_port: edgir.LocalPath) -> Optional[List[edgir.LocalPath]]: + """For a link port, return connected block side ports (possibly multiple through an export chain).""" + return self._link_to_block_ports.get(link_port.SerializeToString()) + class ScalaCompilerInstance: kDevRelpath = "../../compiler/target/scala-2.13/edg-compiler-assembly-0.1-SNAPSHOT.jar" From 017727b2ec47213f045227f6279fb5e04841da41 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 25 Apr 2026 18:15:16 -0700 Subject: [PATCH 19/25] wip --- edg/core/CompiledDesignExport.py | 61 ++++++++++++++++++++------------ edg/core/FnTransformUtil.py | 14 ++++---- 2 files changed, 47 insertions(+), 28 deletions(-) diff --git a/edg/core/CompiledDesignExport.py b/edg/core/CompiledDesignExport.py index 3c68d0625..5fa335006 100644 --- a/edg/core/CompiledDesignExport.py +++ b/edg/core/CompiledDesignExport.py @@ -82,27 +82,35 @@ def _param_to_type(cls, elt: edgir.ValInit) -> str: return f"array({cls._param_to_type(elt.array)})" return param_type + @classmethod + def _param_value_to_json(cls, value: Any) -> Any: + if isinstance(value, Range): # convert to Pydantic friendly + # JSON can't encode inf / -inf by standard, so convert to strings + if value == RangeExpr.EMPTY: + return "∅" + else: + lower: Union[float, str] = value.lower + upper: Union[float, str] = value.upper + if lower == float("inf"): + lower = "inf" + elif lower == float("-inf"): + lower = "-inf" + if upper == float("inf"): + upper = "inf" + elif upper == float("-inf"): + upper = "-inf" + return (lower, upper) + elif isinstance(value, list): + return [cls._param_value_to_json(elt) for elt in value] + else: + return value + def _param_to_compiled(self, path: Path, elt: edgir.ValInit) -> CompiledParam: if path.params[-1] in self._EXCLUDED_PARAM_VALUES: value: Optional[Any] = "" else: - value = self._design.get_value(path.to_local_path()) - if isinstance(value, Range): # convert to Pydantic friendly - # JSON can't encode inf / -inf by standard, so convert to strings - if value == RangeExpr.EMPTY: - value = "∅" - else: - lower: Union[float, str] = value.lower - upper: Union[float, str] = value.upper - if lower == float("inf"): - lower = "inf" - elif lower == float("-inf"): - lower = "-inf" - if upper == float("inf"): - upper = "inf" - elif upper == float("-inf"): - upper = "-inf" - value = (lower, upper) + value = self._param_value_to_json(self._design.get_value(path.to_local_path())) + return CompiledParam( type=self._param_to_type(elt), value=value, @@ -171,22 +179,31 @@ def transform_port( ) elif isinstance(elt, edgir.PortArray): return CompiledPortArray(dict(ports)) + else: + raise ValueError(f"unknown port type {type(elt)}") @override def transform_link( self, context: TransformContext, - elt: edgir.Link, + elt: Union[edgir.Link, edgir.LinkArray], ports: Mapping[str, Union[CompiledPort, CompiledPortArray]], links: Mapping[str, CompiledLink], ) -> CompiledLink: + if isinstance(elt, edgir.Link): + params = { + param_pair.name: self._param_to_compiled(context.path.append_param(param_pair.name), param_pair.value) + for param_pair in elt.params + } + elif isinstance(elt, edgir.LinkArray): + params = {} + else: + raise ValueError(f"unknown link type {type(elt)}") + return CompiledLink( path=self._path_to_path(context.path), cls=self._libpath_to_str(elt.self_class), - params={ - param_pair.name: self._param_to_compiled(context.path.append_param(param_pair.name), param_pair.value) - for param_pair in elt.params - }, + params=params, ports=dict(ports), links=dict(links), ) diff --git a/edg/core/FnTransformUtil.py b/edg/core/FnTransformUtil.py index e5b894bd1..73a8bf10d 100644 --- a/edg/core/FnTransformUtil.py +++ b/edg/core/FnTransformUtil.py @@ -34,7 +34,7 @@ def _visit_portlike(self, context: TransformContext, elt: edgir.PortLike) -> Tra elif elt.HasField("lib_elem"): raise ValueError(f"unresolved PortLike lib at {context}") else: - raise ValueError(f"unknown PortLike type {type(elt)} at {context}") + raise ValueError(f"unknown PortLike type {elt.WhichOneof('is')} at {context}") def _visit_blocklike(self, context: TransformContext, elt: edgir.BlockLike) -> TransformedBlock: if elt.HasField("hierarchy"): @@ -42,15 +42,17 @@ def _visit_blocklike(self, context: TransformContext, elt: edgir.BlockLike) -> T elif elt.HasField("lib_elem"): raise ValueError(f"unresolved BlockLike lib at {context}") else: - raise ValueError(f"unknown BlockLike type {type(elt)} at {context}") + raise ValueError(f"unknown BlockLike type {elt.WhichOneof('type')} at {context}") def _visit_linklike(self, context: TransformContext, elt: edgir.LinkLike) -> TransformedLink: if elt.HasField("link"): return self.visit_link(context, elt.link) + elif elt.HasField("array"): + return self.visit_link(context, elt.array) elif elt.HasField("lib_elem"): raise ValueError(f"unresolved LinkLike lib at {context}") else: - raise ValueError(f"unknown LinkLike type {type(elt)} at {context}") + raise ValueError(f"unknown LinkLike type {elt.WhichOneof('type')} at {context}") def visit_port(self, context: TransformContext, elt: Union[edgir.Port, edgir.PortArray]) -> TransformedPort: """visit_block, but for ports.""" @@ -66,7 +68,7 @@ def visit_port(self, context: TransformContext, elt: Union[edgir.Port, edgir.Por context.append_port(port_pair.name), port_pair.value ) else: - raise TypeError(f"unknown Port type {type(elt)} at {context}") + raise TypeError(f"unknown Port type {elt.WhichOneof('is')} at {context}") return self.transform_port(context, elt, transformed_ports) def visit_block(self, context: TransformContext, elt: edgir.HierarchyBlock) -> TransformedBlock: @@ -90,7 +92,7 @@ def visit_block(self, context: TransformContext, elt: edgir.HierarchyBlock) -> T ) return self.transform_block(context, elt, transformed_ports, transformed_blocks, transformed_links) - def visit_link(self, context: TransformContext, elt: edgir.Link) -> TransformedLink: + def visit_link(self, context: TransformContext, elt: Union[edgir.Link, edgir.LinkArray]) -> TransformedLink: """visit_block, but for links.""" transformed_ports: Dict[str, TransformedPort] = {} for port_pair in elt.ports: @@ -128,7 +130,7 @@ def transform_block( def transform_link( self, context: TransformContext, - elt: edgir.Link, + elt: Union[edgir.Link, edgir.LinkArray], ports: Mapping[str, TransformedPort], links: Mapping[str, TransformedLink], ) -> TransformedLink: From 8ef21e3ef3455801843df6ea523a95ded375b2bc Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 25 Apr 2026 18:27:12 -0700 Subject: [PATCH 20/25] wip test --- .../resources/edg-compiler-precompiled.jar | Bin 13120321 -> 13143777 bytes edg/core/test_compiled_design_export.py | 11 +++++++++++ 2 files changed, 11 insertions(+) create mode 100644 edg/core/test_compiled_design_export.py diff --git a/edg/core/resources/edg-compiler-precompiled.jar b/edg/core/resources/edg-compiler-precompiled.jar index d9facb499d0069f9374d73a991dfc8b3c2685b61..531227511b99270beb258f789d6d99625989fee8 100644 GIT binary patch delta 203043 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
*185OAjUO7T;O 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

f1~H-5lCNcT=m?rHJ)qfc2Uu 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 F{STOBOvV5J diff --git a/edg/core/test_compiled_design_export.py b/edg/core/test_compiled_design_export.py new file mode 100644 index 000000000..9ce4f58d5 --- /dev/null +++ b/edg/core/test_compiled_design_export.py @@ -0,0 +1,11 @@ +import unittest + +from edg import ScalaCompiler, CompiledDesignExportTransform + + +class CompiledDesignExportTestCase(unittest.TestCase): + def test_export(self) -> None: + from .test_simple_expr_eval import TestEvalReductionBlock + + compiled = ScalaCompiler.compile(TestEvalReductionBlock) + result = CompiledDesignExportTransform(compiled).transform() From 69be794ab91f02dd0b860e57723667e1bb5e2726 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 25 Apr 2026 19:28:25 -0700 Subject: [PATCH 21/25] Update test_compiled_design_export.py --- edg/core/test_compiled_design_export.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/edg/core/test_compiled_design_export.py b/edg/core/test_compiled_design_export.py index 9ce4f58d5..1ebba56f0 100644 --- a/edg/core/test_compiled_design_export.py +++ b/edg/core/test_compiled_design_export.py @@ -4,8 +4,23 @@ class CompiledDesignExportTestCase(unittest.TestCase): - def test_export(self) -> None: + def test_hierarchy(self) -> None: + from .test_hierarchy_block import TopHierarchyBlock + + compiled = ScalaCompiler.compile(TopHierarchyBlock) + result = CompiledDesignExportTransform(compiled).transform() + self.assertEqual(result.blocks["source"].cls, "edg.core.test_common.TestBlockSource") + self.assertEqual(result.blocks["sink1"].cls, "edg.core.test_common.TestBlockSink") + self.assertEqual(result.blocks["sink2"].cls, "edg.core.test_common.TestBlockSink") + self.assertEqual(result.links["test_net"].cls, "edg.core.test_common.TestLink") + self.assertEqual(result.blocks["source"].ports["source"].connected_path, "test_net.source") + self.assertEqual(result.blocks["sink1"].ports["sink"].connected_path, "test_net.sinks.0") + self.assertEqual(result.blocks["sink2"].ports["sink"].connected_path, "test_net.sinks.1") + + def test_param_values(self) -> None: from .test_simple_expr_eval import TestEvalReductionBlock compiled = ScalaCompiler.compile(TestEvalReductionBlock) result = CompiledDesignExportTransform(compiled).transform() + self.assertEqual(result.links["link"].params["range_sum"].value, (6.0, 130.0)) + self.assertEqual(result.links["link"].params["range_intersection"].value, (5.0, 10.0)) From b17bf6d85bea1f5a9a1734ec770c312a70005101 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 25 Apr 2026 19:36:54 -0700 Subject: [PATCH 22/25] blacken --- edg/edgir/common_pb2.py | 12 +- edg/edgir/common_pb2.pyi | 205 ++++++---- edg/edgir/elem_pb2.py | 13 +- edg/edgir/elem_pb2.pyi | 619 ++++++++++++++++-------------- edg/edgir/expr_pb2.py | 13 +- edg/edgir/expr_pb2.pyi | 724 ++++++++++++++++++++---------------- edg/edgir/impl_pb2.py | 11 +- edg/edgir/impl_pb2.pyi | 68 ++-- edg/edgir/init_pb2.py | 11 +- edg/edgir/init_pb2.pyi | 124 +++--- edg/edgir/lit_pb2.py | 13 +- edg/edgir/lit_pb2.pyi | 209 ++++++----- edg/edgir/name_pb2.py | 11 +- edg/edgir/name_pb2.pyi | 45 +-- edg/edgir/ref_pb2.py | 11 +- edg/edgir/ref_pb2.pyi | 128 ++++--- edg/edgir/schema_pb2.py | 13 +- edg/edgir/schema_pb2.pyi | 171 +++++---- edg/edgrpc/compiler_pb2.py | 11 +- edg/edgrpc/compiler_pb2.pyi | 142 ++++--- edg/edgrpc/hdl_pb2.py | 13 +- edg/edgrpc/hdl_pb2.pyi | 599 ++++++++++++++++------------- 22 files changed, 1772 insertions(+), 1394 deletions(-) diff --git a/edg/edgir/common_pb2.py b/edg/edgir/common_pb2.py index 01c1565e4..a88fe9b8c 100644 --- a/edg/edgir/common_pb2.py +++ b/edg/edgir/common_pb2.py @@ -1,16 +1,20 @@ """Generated protocol buffer code.""" + from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database + _sym_db = _symbol_database.Default() -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12edgir/common.proto\x12\x0cedgir.common"\x95\x03\n\x08Metadata\x12&\n\x07unknown\x18\x01 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12\x0f\n\x05known\x18\x02 \x01(\tH\x00\x121\n\x07members\x18e \x01(\x0b2\x1e.edgir.common.Metadata.MembersH\x01\x12\x13\n\ttext_leaf\x18f \x01(\tH\x01\x12\x12\n\x08bin_leaf\x18g \x01(\x0cH\x01\x125\n\x0esource_locator\x18n \x01(\x0b2\x1b.edgir.common.SourceLocatorH\x01\x12$\n\x05error\x18p \x01(\x0b2\x13.edgir.common.ErrorH\x01\x1a\x86\x01\n\x07Members\x126\n\x04node\x18\n \x03(\x0b2(.edgir.common.Metadata.Members.NodeEntry\x1aC\n\tNodeEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12%\n\x05value\x18\x02 \x01(\x0b2\x16.edgir.common.Metadata:\x028\x01B\x06\n\x04typeB\x06\n\x04meta"\xc9\x01\n\rSourceLocator\x12\x14\n\x0cfile_package\x18\x01 \x01(\t\x12\x13\n\x0bline_offset\x18\x02 \x01(\x05\x12\x12\n\ncol_offset\x18\x03 \x01(\x05\x12;\n\x0bsource_type\x18\x04 \x01(\x0e2&.edgir.common.SourceLocator.SourceType"<\n\nSourceType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0e\n\nDEFINITION\x10\x01\x12\x11\n\rINSTANTIATION\x10\x02"X\n\x05Error\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x11\n\ttraceback\x18\x03 \x01(\t\x12+\n\x06source\x18\x02 \x03(\x0b2\x1b.edgir.common.SourceLocator"\x07\n\x05Emptyb\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n\x12edgir/common.proto\x12\x0cedgir.common"\x95\x03\n\x08Metadata\x12&\n\x07unknown\x18\x01 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12\x0f\n\x05known\x18\x02 \x01(\tH\x00\x121\n\x07members\x18e \x01(\x0b2\x1e.edgir.common.Metadata.MembersH\x01\x12\x13\n\ttext_leaf\x18f \x01(\tH\x01\x12\x12\n\x08bin_leaf\x18g \x01(\x0cH\x01\x125\n\x0esource_locator\x18n \x01(\x0b2\x1b.edgir.common.SourceLocatorH\x01\x12$\n\x05error\x18p \x01(\x0b2\x13.edgir.common.ErrorH\x01\x1a\x86\x01\n\x07Members\x126\n\x04node\x18\n \x03(\x0b2(.edgir.common.Metadata.Members.NodeEntry\x1aC\n\tNodeEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12%\n\x05value\x18\x02 \x01(\x0b2\x16.edgir.common.Metadata:\x028\x01B\x06\n\x04typeB\x06\n\x04meta"\xc9\x01\n\rSourceLocator\x12\x14\n\x0cfile_package\x18\x01 \x01(\t\x12\x13\n\x0bline_offset\x18\x02 \x01(\x05\x12\x12\n\ncol_offset\x18\x03 \x01(\x05\x12;\n\x0bsource_type\x18\x04 \x01(\x0e2&.edgir.common.SourceLocator.SourceType"<\n\nSourceType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0e\n\nDEFINITION\x10\x01\x12\x11\n\rINSTANTIATION\x10\x02"X\n\x05Error\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x11\n\ttraceback\x18\x03 \x01(\t\x12+\n\x06source\x18\x02 \x03(\x0b2\x1b.edgir.common.SourceLocator"\x07\n\x05Emptyb\x06proto3' +) _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'edgir.common_pb2', globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "edgir.common_pb2", globals()) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None _METADATA_MEMBERS_NODEENTRY._options = None - _METADATA_MEMBERS_NODEENTRY._serialized_options = b'8\x01' + _METADATA_MEMBERS_NODEENTRY._serialized_options = b"8\x01" _METADATA._serialized_start = 37 _METADATA._serialized_end = 442 _METADATA_MEMBERS._serialized_start = 292 @@ -24,4 +28,4 @@ _ERROR._serialized_start = 648 _ERROR._serialized_end = 736 _EMPTY._serialized_start = 738 - _EMPTY._serialized_end = 745 \ No newline at end of file + _EMPTY._serialized_end = 745 diff --git a/edg/edgir/common_pb2.pyi b/edg/edgir/common_pb2.pyi index bad85ffc9..4fa8ab79c 100644 --- a/edg/edgir/common_pb2.pyi +++ b/edg/edgir/common_pb2.pyi @@ -7,6 +7,7 @@ Package : edg.common This is where we keep shared types that we reuse and don't have a good place for. """ + from collections import abc as _abc from google.protobuf import descriptor as _descriptor from google.protobuf import message as _message @@ -15,6 +16,7 @@ from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper import builtins as _builtins import sys import typing as _typing + if sys.version_info >= (3, 10): from typing import TypeAlias as _TypeAlias else: @@ -24,6 +26,7 @@ DESCRIPTOR: _descriptor.FileDescriptor @_typing.final class Metadata(_message.Message): """* Arbitrary metadata stored in tree form.""" + DESCRIPTOR: _descriptor.Descriptor @_typing.final @@ -38,31 +41,24 @@ class Metadata(_message.Message): key: _builtins.str @_builtins.property - def value(self) -> Global___Metadata: - ... + def value(self) -> Global___Metadata: ... + def __init__(self, *, key: _builtins.str = ..., value: Global___Metadata | None = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["value", b"value"] - def __init__(self, *, key: _builtins.str=..., value: Global___Metadata | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['value', b'value'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["key", b"key", "value", b"value"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['key', b'key', 'value', b'value'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... NODE_FIELD_NUMBER: _builtins.int @_builtins.property - def node(self) -> _containers.MessageMap[_builtins.str, Global___Metadata]: - ... + def node(self) -> _containers.MessageMap[_builtins.str, Global___Metadata]: ... + def __init__(self, *, node: _abc.Mapping[_builtins.str, Global___Metadata] | None = ...) -> None: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["node", b"node"] - def __init__(self, *, node: _abc.Mapping[_builtins.str, Global___Metadata] | None=...) -> None: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['node', b'node'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... UNKNOWN_FIELD_NUMBER: _builtins.int KNOWN_FIELD_NUMBER: _builtins.int MEMBERS_FIELD_NUMBER: _builtins.int @@ -73,16 +69,12 @@ class Metadata(_message.Message): known: _builtins.str text_leaf: _builtins.str bin_leaf: _builtins.bytes - '* I wanted to split binary and text data, since we might\n just want to dump a raw file/image/datasheet in here\n for safekeeping.\n\n Mixing up binary and textual formats is just a recipe\n for trouble.\n ' + "* I wanted to split binary and text data, since we might\n just want to dump a raw file/image/datasheet in here\n for safekeeping.\n\n Mixing up binary and textual formats is just a recipe\n for trouble.\n " @_builtins.property - def unknown(self) -> Global___Empty: - ... - + def unknown(self) -> Global___Empty: ... @_builtins.property - def members(self) -> Global___Metadata.Members: - ... - + def members(self) -> Global___Metadata.Members: ... @_builtins.property def source_locator(self) -> Global___SourceLocator: """Defined formats @@ -91,31 +83,74 @@ class Metadata(_message.Message): """ @_builtins.property - def error(self) -> Global___Error: - ... - - def __init__(self, *, unknown: Global___Empty | None=..., known: _builtins.str=..., members: Global___Metadata.Members | None=..., text_leaf: _builtins.str=..., bin_leaf: _builtins.bytes=..., source_locator: Global___SourceLocator | None=..., error: Global___Error | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['bin_leaf', b'bin_leaf', 'error', b'error', 'known', b'known', 'members', b'members', 'meta', b'meta', 'source_locator', b'source_locator', 'text_leaf', b'text_leaf', 'type', b'type', 'unknown', b'unknown'] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['bin_leaf', b'bin_leaf', 'error', b'error', 'known', b'known', 'members', b'members', 'meta', b'meta', 'source_locator', b'source_locator', 'text_leaf', b'text_leaf', 'type', b'type', 'unknown', b'unknown'] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... - _WhichOneofReturnType_meta: _TypeAlias = _typing.Literal['members', 'text_leaf', 'bin_leaf', 'source_locator', 'error'] - _WhichOneofArgType_meta: _TypeAlias = _typing.Literal['meta', b'meta'] - _WhichOneofReturnType_type: _TypeAlias = _typing.Literal['unknown', 'known'] - _WhichOneofArgType_type: _TypeAlias = _typing.Literal['type', b'type'] + def error(self) -> Global___Error: ... + def __init__( + self, + *, + unknown: Global___Empty | None = ..., + known: _builtins.str = ..., + members: Global___Metadata.Members | None = ..., + text_leaf: _builtins.str = ..., + bin_leaf: _builtins.bytes = ..., + source_locator: Global___SourceLocator | None = ..., + error: Global___Error | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal[ + "bin_leaf", + b"bin_leaf", + "error", + b"error", + "known", + b"known", + "members", + b"members", + "meta", + b"meta", + "source_locator", + b"source_locator", + "text_leaf", + b"text_leaf", + "type", + b"type", + "unknown", + b"unknown", + ] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "bin_leaf", + b"bin_leaf", + "error", + b"error", + "known", + b"known", + "members", + b"members", + "meta", + b"meta", + "source_locator", + b"source_locator", + "text_leaf", + b"text_leaf", + "type", + b"type", + "unknown", + b"unknown", + ] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_meta: _TypeAlias = _typing.Literal[ + "members", "text_leaf", "bin_leaf", "source_locator", "error" + ] + _WhichOneofArgType_meta: _TypeAlias = _typing.Literal["meta", b"meta"] + _WhichOneofReturnType_type: _TypeAlias = _typing.Literal["unknown", "known"] + _WhichOneofArgType_type: _TypeAlias = _typing.Literal["type", b"type"] @_typing.overload - def WhichOneof(self, oneof_group: _WhichOneofArgType_meta) -> _WhichOneofReturnType_meta | None: - ... - + def WhichOneof(self, oneof_group: _WhichOneofArgType_meta) -> _WhichOneofReturnType_meta | None: ... @_typing.overload - def WhichOneof(self, oneof_group: _WhichOneofArgType_type) -> _WhichOneofReturnType_type | None: - ... + def WhichOneof(self, oneof_group: _WhichOneofArgType_type) -> _WhichOneofReturnType_type | None: ... + Global___Metadata: _TypeAlias = Metadata @_typing.final @@ -124,45 +159,62 @@ class SourceLocator(_message.Message): * For locating source data """ + DESCRIPTOR: _descriptor.Descriptor class _SourceType: - ValueType = _typing.NewType('ValueType', _builtins.int) + ValueType = _typing.NewType("ValueType", _builtins.int) V: _TypeAlias = ValueType - class _SourceTypeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[SourceLocator._SourceType.ValueType], _builtins.type): + class _SourceTypeEnumTypeWrapper( + _enum_type_wrapper._EnumTypeWrapper[SourceLocator._SourceType.ValueType], _builtins.type + ): DESCRIPTOR: _descriptor.EnumDescriptor UNKNOWN: SourceLocator._SourceType.ValueType DEFINITION: SourceLocator._SourceType.ValueType - 'source defining this class, would be present in library' + "source defining this class, would be present in library" INSTANTIATION: SourceLocator._SourceType.ValueType - 'source of instantiation, would be present in design' + "source of instantiation, would be present in design" - class SourceType(_SourceType, metaclass=_SourceTypeEnumTypeWrapper): - ... + class SourceType(_SourceType, metaclass=_SourceTypeEnumTypeWrapper): ... UNKNOWN: SourceLocator.SourceType.ValueType DEFINITION: SourceLocator.SourceType.ValueType - 'source defining this class, would be present in library' + "source defining this class, would be present in library" INSTANTIATION: SourceLocator.SourceType.ValueType - 'source of instantiation, would be present in design' + "source of instantiation, would be present in design" FILE_PACKAGE_FIELD_NUMBER: _builtins.int LINE_OFFSET_FIELD_NUMBER: _builtins.int COL_OFFSET_FIELD_NUMBER: _builtins.int SOURCE_TYPE_FIELD_NUMBER: _builtins.int file_package: _builtins.str - 'package name (portable, not tied to an absolute path) that locates the file' + "package name (portable, not tied to an absolute path) that locates the file" line_offset: _builtins.int - 'line number' + "line number" col_offset: _builtins.int - 'character offset within the line' + "character offset within the line" source_type: Global___SourceLocator.SourceType.ValueType - def __init__(self, *, file_package: _builtins.str=..., line_offset: _builtins.int=..., col_offset: _builtins.int=..., source_type: Global___SourceLocator.SourceType.ValueType=...) -> None: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['col_offset', b'col_offset', 'file_package', b'file_package', 'line_offset', b'line_offset', 'source_type', b'source_type'] + def __init__( + self, + *, + file_package: _builtins.str = ..., + line_offset: _builtins.int = ..., + col_offset: _builtins.int = ..., + source_type: Global___SourceLocator.SourceType.ValueType = ..., + ) -> None: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "col_offset", + b"col_offset", + "file_package", + b"file_package", + "line_offset", + b"line_offset", + "source_type", + b"source_type", + ] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___SourceLocator: _TypeAlias = SourceLocator @_typing.final @@ -170,32 +222,41 @@ class Error(_message.Message): """* Used to communicate results of analysis / checking passes. Limited to Block and Link objects. """ + DESCRIPTOR: _descriptor.Descriptor MESSAGE_FIELD_NUMBER: _builtins.int TRACEBACK_FIELD_NUMBER: _builtins.int SOURCE_FIELD_NUMBER: _builtins.int message: _builtins.str - 'free-form error message' + "free-form error message" traceback: _builtins.str - 'full traceback TODO: should there be a structured stack trace?' + "full traceback TODO: should there be a structured stack trace?" @_builtins.property def source(self) -> _containers.RepeatedCompositeFieldContainer[Global___SourceLocator]: """source locator, eg line of failing constraint""" - def __init__(self, *, message: _builtins.str=..., traceback: _builtins.str=..., source: _abc.Iterable[Global___SourceLocator] | None=...) -> None: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['message', b'message', 'source', b'source', 'traceback', b'traceback'] + def __init__( + self, + *, + message: _builtins.str = ..., + traceback: _builtins.str = ..., + source: _abc.Iterable[Global___SourceLocator] | None = ..., + ) -> None: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "message", b"message", "source", b"source", "traceback", b"traceback" + ] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___Error: _TypeAlias = Error @_typing.final class Empty(_message.Message): """* Placeholder until I figure out how to import properly""" + DESCRIPTOR: _descriptor.Descriptor - def __init__(self) -> None: - ... -Global___Empty: _TypeAlias = Empty \ No newline at end of file + def __init__(self) -> None: ... + +Global___Empty: _TypeAlias = Empty diff --git a/edg/edgir/elem_pb2.py b/edg/edgir/elem_pb2.py index 1848baf86..5b5633fd0 100644 --- a/edg/edgir/elem_pb2.py +++ b/edg/edgir/elem_pb2.py @@ -1,20 +1,25 @@ """Generated protocol buffer code.""" + from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database + _sym_db = _symbol_database.Default() from ..edgir import common_pb2 as edgir_dot_common__pb2 from ..edgir import init_pb2 as edgir_dot_init__pb2 from ..edgir import expr_pb2 as edgir_dot_expr__pb2 from ..edgir import ref_pb2 as edgir_dot_ref__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10edgir/elem.proto\x12\nedgir.elem\x1a\x12edgir/common.proto\x1a\x10edgir/init.proto\x1a\x10edgir/expr.proto\x1a\x0fedgir/ref.proto"@\n\x0cNamedValInit\x12\x0c\n\x04name\x18\x01 \x01(\t\x12"\n\x05value\x18\x02 \x01(\x0b2\x13.edgir.init.ValInit"D\n\x0eNamedValueExpr\x12\x0c\n\x04name\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr"B\n\rNamedPortLike\x12\x0c\n\x04name\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b2\x14.edgir.elem.PortLike"D\n\x0eNamedBlockLike\x12\x0c\n\x04name\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b2\x15.edgir.elem.BlockLike"B\n\rNamedLinkLike\x12\x0c\n\x04name\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b2\x14.edgir.elem.LinkLike"\xbf\x02\n\x04Port\x12(\n\x06params\x18( \x03(\x0b2\x18.edgir.elem.NamedValInit\x12/\n\x0bconstraints\x18) \x03(\x0b2\x1a.edgir.elem.NamedValueExpr\x12(\n\x05ports\x18* \x03(\x0b2\x19.edgir.elem.NamedPortLike\x12*\n\nself_class\x18\x14 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12,\n\x0csuperclasses\x18\x15 \x03(\x0b2\x16.edgir.ref.LibraryPath\x122\n\x12super_superclasses\x18\x18 \x03(\x0b2\x16.edgir.ref.LibraryPath\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata"\xca\x01\n\tPortArray\x12*\n\nself_class\x18\x14 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12,\n\x05ports\x18\x0e \x01(\x0b2\x1b.edgir.elem.PortArray.PortsH\x00\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata\x1a1\n\x05Ports\x12(\n\x05ports\x18( \x03(\x0b2\x19.edgir.elem.NamedPortLikeB\n\n\x08contains"\xb0\x01\n\x08PortLike\x12(\n\tundefined\x18\x01 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12*\n\x08lib_elem\x18\x02 \x01(\x0b2\x16.edgir.ref.LibraryPathH\x00\x12 \n\x04port\x18\x03 \x01(\x0b2\x10.edgir.elem.PortH\x00\x12&\n\x05array\x18\x04 \x01(\x0b2\x15.edgir.elem.PortArrayH\x00B\x04\n\x02is"=\n\tParameter\x12"\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12\x0c\n\x04unit\x18\x02 \x01(\t"a\n\x18StringDescriptionElement\x12\x0e\n\x04text\x18\x01 \x01(\tH\x00\x12&\n\x05param\x18\x02 \x01(\x0b2\x15.edgir.elem.ParameterH\x00B\r\n\x0bElementType"\xc4\x06\n\x0eHierarchyBlock\x12(\n\x06params\x18( \x03(\x0b2\x18.edgir.elem.NamedValInit\x12E\n\x0eparam_defaults\x18\x0f \x03(\x0b2-.edgir.elem.HierarchyBlock.ParamDefaultsEntry\x12(\n\x05ports\x18) \x03(\x0b2\x19.edgir.elem.NamedPortLike\x12*\n\x06blocks\x18* \x03(\x0b2\x1a.edgir.elem.NamedBlockLike\x12(\n\x05links\x18+ \x03(\x0b2\x19.edgir.elem.NamedLinkLike\x12/\n\x0bconstraints\x18, \x03(\x0b2\x1a.edgir.elem.NamedValueExpr\x12*\n\nself_class\x18\x17 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12,\n\x0csuperclasses\x18\x14 \x03(\x0b2\x16.edgir.ref.LibraryPath\x122\n\x12super_superclasses\x18\x18 \x03(\x0b2\x16.edgir.ref.LibraryPath\x12/\n\x0fprerefine_class\x18\x15 \x01(\x0b2\x16.edgir.ref.LibraryPath\x120\n\x10prerefine_mixins\x18\x19 \x03(\x0b2\x16.edgir.ref.LibraryPath\x12(\n\tgenerator\x18\x16 \x01(\x0b2\x15.edgir.elem.Generator\x12\x13\n\x0bis_abstract\x18\x1e \x01(\x08\x122\n\x12default_refinement\x18\x1f \x01(\x0b2\x16.edgir.ref.LibraryPath\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata\x129\n\x0bdescription\x18\x01 \x03(\x0b2$.edgir.elem.StringDescriptionElement\x1aK\n\x12ParamDefaultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr:\x028\x01":\n\tGenerator\x12-\n\x0frequired_params\x18\x02 \x03(\x0b2\x14.edgir.ref.LocalPath"\\\n\x0cBlockLibrary\x12$\n\x04base\x18\x02 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12&\n\x06mixins\x18\x03 \x03(\x0b2\x16.edgir.ref.LibraryPath"\x9c\x01\n\tBlockLike\x12(\n\tundefined\x18\x01 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12,\n\x08lib_elem\x18\x05 \x01(\x0b2\x18.edgir.elem.BlockLibraryH\x00\x12/\n\thierarchy\x18\x04 \x01(\x0b2\x1a.edgir.elem.HierarchyBlockH\x00B\x06\n\x04type"\xa4\x03\n\x04Link\x12(\n\x06params\x18( \x03(\x0b2\x18.edgir.elem.NamedValInit\x12(\n\x05ports\x18) \x03(\x0b2\x19.edgir.elem.NamedPortLike\x12(\n\x05links\x18+ \x03(\x0b2\x19.edgir.elem.NamedLinkLike\x12/\n\x0bconstraints\x18* \x03(\x0b2\x1a.edgir.elem.NamedValueExpr\x12*\n\nself_class\x18\x14 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12,\n\x0csuperclasses\x18\x15 \x03(\x0b2\x16.edgir.ref.LibraryPath\x122\n\x12super_superclasses\x18\x18 \x03(\x0b2\x16.edgir.ref.LibraryPath\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata\x129\n\x0bdescription\x18\x01 \x03(\x0b2$.edgir.elem.StringDescriptionElement"\xe2\x01\n\tLinkArray\x12*\n\nself_class\x18\x14 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12(\n\x05ports\x18) \x03(\x0b2\x19.edgir.elem.NamedPortLike\x12/\n\x0bconstraints\x18* \x03(\x0b2\x1a.edgir.elem.NamedValueExpr\x12(\n\x05links\x18+ \x03(\x0b2\x19.edgir.elem.NamedLinkLike\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata"\xb2\x01\n\x08LinkLike\x12(\n\tundefined\x18\x01 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12*\n\x08lib_elem\x18\x02 \x01(\x0b2\x16.edgir.ref.LibraryPathH\x00\x12 \n\x04link\x18\x03 \x01(\x0b2\x10.edgir.elem.LinkH\x00\x12&\n\x05array\x18\x04 \x01(\x0b2\x15.edgir.elem.LinkArrayH\x00B\x06\n\x04typeb\x06proto3') + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n\x10edgir/elem.proto\x12\nedgir.elem\x1a\x12edgir/common.proto\x1a\x10edgir/init.proto\x1a\x10edgir/expr.proto\x1a\x0fedgir/ref.proto"@\n\x0cNamedValInit\x12\x0c\n\x04name\x18\x01 \x01(\t\x12"\n\x05value\x18\x02 \x01(\x0b2\x13.edgir.init.ValInit"D\n\x0eNamedValueExpr\x12\x0c\n\x04name\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr"B\n\rNamedPortLike\x12\x0c\n\x04name\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b2\x14.edgir.elem.PortLike"D\n\x0eNamedBlockLike\x12\x0c\n\x04name\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b2\x15.edgir.elem.BlockLike"B\n\rNamedLinkLike\x12\x0c\n\x04name\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b2\x14.edgir.elem.LinkLike"\xbf\x02\n\x04Port\x12(\n\x06params\x18( \x03(\x0b2\x18.edgir.elem.NamedValInit\x12/\n\x0bconstraints\x18) \x03(\x0b2\x1a.edgir.elem.NamedValueExpr\x12(\n\x05ports\x18* \x03(\x0b2\x19.edgir.elem.NamedPortLike\x12*\n\nself_class\x18\x14 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12,\n\x0csuperclasses\x18\x15 \x03(\x0b2\x16.edgir.ref.LibraryPath\x122\n\x12super_superclasses\x18\x18 \x03(\x0b2\x16.edgir.ref.LibraryPath\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata"\xca\x01\n\tPortArray\x12*\n\nself_class\x18\x14 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12,\n\x05ports\x18\x0e \x01(\x0b2\x1b.edgir.elem.PortArray.PortsH\x00\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata\x1a1\n\x05Ports\x12(\n\x05ports\x18( \x03(\x0b2\x19.edgir.elem.NamedPortLikeB\n\n\x08contains"\xb0\x01\n\x08PortLike\x12(\n\tundefined\x18\x01 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12*\n\x08lib_elem\x18\x02 \x01(\x0b2\x16.edgir.ref.LibraryPathH\x00\x12 \n\x04port\x18\x03 \x01(\x0b2\x10.edgir.elem.PortH\x00\x12&\n\x05array\x18\x04 \x01(\x0b2\x15.edgir.elem.PortArrayH\x00B\x04\n\x02is"=\n\tParameter\x12"\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12\x0c\n\x04unit\x18\x02 \x01(\t"a\n\x18StringDescriptionElement\x12\x0e\n\x04text\x18\x01 \x01(\tH\x00\x12&\n\x05param\x18\x02 \x01(\x0b2\x15.edgir.elem.ParameterH\x00B\r\n\x0bElementType"\xc4\x06\n\x0eHierarchyBlock\x12(\n\x06params\x18( \x03(\x0b2\x18.edgir.elem.NamedValInit\x12E\n\x0eparam_defaults\x18\x0f \x03(\x0b2-.edgir.elem.HierarchyBlock.ParamDefaultsEntry\x12(\n\x05ports\x18) \x03(\x0b2\x19.edgir.elem.NamedPortLike\x12*\n\x06blocks\x18* \x03(\x0b2\x1a.edgir.elem.NamedBlockLike\x12(\n\x05links\x18+ \x03(\x0b2\x19.edgir.elem.NamedLinkLike\x12/\n\x0bconstraints\x18, \x03(\x0b2\x1a.edgir.elem.NamedValueExpr\x12*\n\nself_class\x18\x17 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12,\n\x0csuperclasses\x18\x14 \x03(\x0b2\x16.edgir.ref.LibraryPath\x122\n\x12super_superclasses\x18\x18 \x03(\x0b2\x16.edgir.ref.LibraryPath\x12/\n\x0fprerefine_class\x18\x15 \x01(\x0b2\x16.edgir.ref.LibraryPath\x120\n\x10prerefine_mixins\x18\x19 \x03(\x0b2\x16.edgir.ref.LibraryPath\x12(\n\tgenerator\x18\x16 \x01(\x0b2\x15.edgir.elem.Generator\x12\x13\n\x0bis_abstract\x18\x1e \x01(\x08\x122\n\x12default_refinement\x18\x1f \x01(\x0b2\x16.edgir.ref.LibraryPath\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata\x129\n\x0bdescription\x18\x01 \x03(\x0b2$.edgir.elem.StringDescriptionElement\x1aK\n\x12ParamDefaultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr:\x028\x01":\n\tGenerator\x12-\n\x0frequired_params\x18\x02 \x03(\x0b2\x14.edgir.ref.LocalPath"\\\n\x0cBlockLibrary\x12$\n\x04base\x18\x02 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12&\n\x06mixins\x18\x03 \x03(\x0b2\x16.edgir.ref.LibraryPath"\x9c\x01\n\tBlockLike\x12(\n\tundefined\x18\x01 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12,\n\x08lib_elem\x18\x05 \x01(\x0b2\x18.edgir.elem.BlockLibraryH\x00\x12/\n\thierarchy\x18\x04 \x01(\x0b2\x1a.edgir.elem.HierarchyBlockH\x00B\x06\n\x04type"\xa4\x03\n\x04Link\x12(\n\x06params\x18( \x03(\x0b2\x18.edgir.elem.NamedValInit\x12(\n\x05ports\x18) \x03(\x0b2\x19.edgir.elem.NamedPortLike\x12(\n\x05links\x18+ \x03(\x0b2\x19.edgir.elem.NamedLinkLike\x12/\n\x0bconstraints\x18* \x03(\x0b2\x1a.edgir.elem.NamedValueExpr\x12*\n\nself_class\x18\x14 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12,\n\x0csuperclasses\x18\x15 \x03(\x0b2\x16.edgir.ref.LibraryPath\x122\n\x12super_superclasses\x18\x18 \x03(\x0b2\x16.edgir.ref.LibraryPath\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata\x129\n\x0bdescription\x18\x01 \x03(\x0b2$.edgir.elem.StringDescriptionElement"\xe2\x01\n\tLinkArray\x12*\n\nself_class\x18\x14 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12(\n\x05ports\x18) \x03(\x0b2\x19.edgir.elem.NamedPortLike\x12/\n\x0bconstraints\x18* \x03(\x0b2\x1a.edgir.elem.NamedValueExpr\x12(\n\x05links\x18+ \x03(\x0b2\x19.edgir.elem.NamedLinkLike\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata"\xb2\x01\n\x08LinkLike\x12(\n\tundefined\x18\x01 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12*\n\x08lib_elem\x18\x02 \x01(\x0b2\x16.edgir.ref.LibraryPathH\x00\x12 \n\x04link\x18\x03 \x01(\x0b2\x10.edgir.elem.LinkH\x00\x12&\n\x05array\x18\x04 \x01(\x0b2\x15.edgir.elem.LinkArrayH\x00B\x06\n\x04typeb\x06proto3' +) _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'edgir.elem_pb2', globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "edgir.elem_pb2", globals()) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None _HIERARCHYBLOCK_PARAMDEFAULTSENTRY._options = None - _HIERARCHYBLOCK_PARAMDEFAULTSENTRY._serialized_options = b'8\x01' + _HIERARCHYBLOCK_PARAMDEFAULTSENTRY._serialized_options = b"8\x01" _NAMEDVALINIT._serialized_start = 105 _NAMEDVALINIT._serialized_end = 169 _NAMEDVALUEEXPR._serialized_start = 171 @@ -52,4 +57,4 @@ _LINKARRAY._serialized_start = 2891 _LINKARRAY._serialized_end = 3117 _LINKLIKE._serialized_start = 3120 - _LINKLIKE._serialized_end = 3298 \ No newline at end of file + _LINKLIKE._serialized_end = 3298 diff --git a/edg/edgir/elem_pb2.pyi b/edg/edgir/elem_pb2.pyi index 9c09803fc..4922395ee 100644 --- a/edg/edgir/elem_pb2.pyi +++ b/edg/edgir/elem_pb2.pyi @@ -13,6 +13,7 @@ We don't strictly differentiate between library elements and elements within a design within the protobuf. In general, when there is a library element, we """ + from collections import abc as _abc from edgir import common_pb2 as _common_pb2 from edgir import expr_pb2 as _expr_pb2 @@ -24,6 +25,7 @@ from google.protobuf.internal import containers as _containers import builtins as _builtins import sys import typing as _typing + if sys.version_info >= (3, 10): from typing import TypeAlias as _TypeAlias else: @@ -36,25 +38,22 @@ class NamedValInit(_message.Message): are unordered (whereas we want to preserve ordering to preserve design intent through the compiler), we use a sequence of these pairs. """ + DESCRIPTOR: _descriptor.Descriptor NAME_FIELD_NUMBER: _builtins.int VALUE_FIELD_NUMBER: _builtins.int name: _builtins.str @_builtins.property - def value(self) -> _init_pb2.ValInit: - ... + def value(self) -> _init_pb2.ValInit: ... + def __init__(self, *, name: _builtins.str = ..., value: _init_pb2.ValInit | None = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["value", b"value"] - def __init__(self, *, name: _builtins.str=..., value: _init_pb2.ValInit | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['value', b'value'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["name", b"name", "value", b"value"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['name', b'name', 'value', b'value'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___NamedValInit: _TypeAlias = NamedValInit @_typing.final @@ -65,19 +64,15 @@ class NamedValueExpr(_message.Message): name: _builtins.str @_builtins.property - def value(self) -> _expr_pb2.ValueExpr: - ... + def value(self) -> _expr_pb2.ValueExpr: ... + def __init__(self, *, name: _builtins.str = ..., value: _expr_pb2.ValueExpr | None = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["value", b"value"] - def __init__(self, *, name: _builtins.str=..., value: _expr_pb2.ValueExpr | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['value', b'value'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["name", b"name", "value", b"value"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['name', b'name', 'value', b'value'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___NamedValueExpr: _TypeAlias = NamedValueExpr @_typing.final @@ -88,19 +83,15 @@ class NamedPortLike(_message.Message): name: _builtins.str @_builtins.property - def value(self) -> Global___PortLike: - ... + def value(self) -> Global___PortLike: ... + def __init__(self, *, name: _builtins.str = ..., value: Global___PortLike | None = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["value", b"value"] - def __init__(self, *, name: _builtins.str=..., value: Global___PortLike | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['value', b'value'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["name", b"name", "value", b"value"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['name', b'name', 'value', b'value'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___NamedPortLike: _TypeAlias = NamedPortLike @_typing.final @@ -111,19 +102,15 @@ class NamedBlockLike(_message.Message): name: _builtins.str @_builtins.property - def value(self) -> Global___BlockLike: - ... + def value(self) -> Global___BlockLike: ... + def __init__(self, *, name: _builtins.str = ..., value: Global___BlockLike | None = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["value", b"value"] - def __init__(self, *, name: _builtins.str=..., value: Global___BlockLike | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['value', b'value'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["name", b"name", "value", b"value"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['name', b'name', 'value', b'value'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___NamedBlockLike: _TypeAlias = NamedBlockLike @_typing.final @@ -134,19 +121,15 @@ class NamedLinkLike(_message.Message): name: _builtins.str @_builtins.property - def value(self) -> Global___LinkLike: - ... + def value(self) -> Global___LinkLike: ... + def __init__(self, *, name: _builtins.str = ..., value: Global___LinkLike | None = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["value", b"value"] - def __init__(self, *, name: _builtins.str=..., value: Global___LinkLike | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['value', b'value'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["name", b"name", "value", b"value"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['name', b'name', 'value', b'value'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___NamedLinkLike: _TypeAlias = NamedLinkLike @_typing.final @@ -161,21 +144,13 @@ class Port(_message.Message): META_FIELD_NUMBER: _builtins.int @_builtins.property - def params(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedValInit]: - ... - + def params(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedValInit]: ... @_builtins.property - def constraints(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedValueExpr]: - ... - + def constraints(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedValueExpr]: ... @_builtins.property - def ports(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedPortLike]: - ... - + def ports(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedPortLike]: ... @_builtins.property - def self_class(self) -> _ref_pb2.LibraryPath: - ... - + def self_class(self) -> _ref_pb2.LibraryPath: ... @_builtins.property def superclasses(self) -> _containers.RepeatedCompositeFieldContainer[_ref_pb2.LibraryPath]: """superclasses, may be empty""" @@ -188,16 +163,39 @@ class Port(_message.Message): def meta(self) -> _common_pb2.Metadata: """TODO: this provides type hierarchy data only, inheritance semantics are currently undefined""" - def __init__(self, *, params: _abc.Iterable[Global___NamedValInit] | None=..., constraints: _abc.Iterable[Global___NamedValueExpr] | None=..., ports: _abc.Iterable[Global___NamedPortLike] | None=..., self_class: _ref_pb2.LibraryPath | None=..., superclasses: _abc.Iterable[_ref_pb2.LibraryPath] | None=..., super_superclasses: _abc.Iterable[_ref_pb2.LibraryPath] | None=..., meta: _common_pb2.Metadata | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta', 'self_class', b'self_class'] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['constraints', b'constraints', 'meta', b'meta', 'params', b'params', 'ports', b'ports', 'self_class', b'self_class', 'super_superclasses', b'super_superclasses', 'superclasses', b'superclasses'] + def __init__( + self, + *, + params: _abc.Iterable[Global___NamedValInit] | None = ..., + constraints: _abc.Iterable[Global___NamedValueExpr] | None = ..., + ports: _abc.Iterable[Global___NamedPortLike] | None = ..., + self_class: _ref_pb2.LibraryPath | None = ..., + superclasses: _abc.Iterable[_ref_pb2.LibraryPath] | None = ..., + super_superclasses: _abc.Iterable[_ref_pb2.LibraryPath] | None = ..., + meta: _common_pb2.Metadata | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta", "self_class", b"self_class"] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "constraints", + b"constraints", + "meta", + b"meta", + "params", + b"params", + "ports", + b"ports", + "self_class", + b"self_class", + "super_superclasses", + b"super_superclasses", + "superclasses", + b"superclasses", + ] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___Port: _TypeAlias = Port @_typing.final @@ -210,15 +208,12 @@ class PortArray(_message.Message): PORTS_FIELD_NUMBER: _builtins.int @_builtins.property - def ports(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedPortLike]: - ... + def ports(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedPortLike]: ... + def __init__(self, *, ports: _abc.Iterable[Global___NamedPortLike] | None = ...) -> None: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["ports", b"ports"] - def __init__(self, *, ports: _abc.Iterable[Global___NamedPortLike] | None=...) -> None: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['ports', b'ports'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... SELF_CLASS_FIELD_NUMBER: _builtins.int PORTS_FIELD_NUMBER: _builtins.int META_FIELD_NUMBER: _builtins.int @@ -230,33 +225,37 @@ class PortArray(_message.Message): """ @_builtins.property - def ports(self) -> Global___PortArray.Ports: - ... - + def ports(self) -> Global___PortArray.Ports: ... @_builtins.property - def meta(self) -> _common_pb2.Metadata: - ... + def meta(self) -> _common_pb2.Metadata: ... + def __init__( + self, + *, + self_class: _ref_pb2.LibraryPath | None = ..., + ports: Global___PortArray.Ports | None = ..., + meta: _common_pb2.Metadata | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal[ + "contains", b"contains", "meta", b"meta", "ports", b"ports", "self_class", b"self_class" + ] - def __init__(self, *, self_class: _ref_pb2.LibraryPath | None=..., ports: Global___PortArray.Ports | None=..., meta: _common_pb2.Metadata | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['contains', b'contains', 'meta', b'meta', 'ports', b'ports', 'self_class', b'self_class'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "contains", b"contains", "meta", b"meta", "ports", b"ports", "self_class", b"self_class" + ] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['contains', b'contains', 'meta', b'meta', 'ports', b'ports', 'self_class', b'self_class'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_contains: _TypeAlias = _typing.Literal["ports"] + _WhichOneofArgType_contains: _TypeAlias = _typing.Literal["contains", b"contains"] - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... - _WhichOneofReturnType_contains: _TypeAlias = _typing.Literal['ports'] - _WhichOneofArgType_contains: _TypeAlias = _typing.Literal['contains', b'contains'] + def WhichOneof(self, oneof_group: _WhichOneofArgType_contains) -> _WhichOneofReturnType_contains | None: ... - def WhichOneof(self, oneof_group: _WhichOneofArgType_contains) -> _WhichOneofReturnType_contains | None: - ... Global___PortArray: _TypeAlias = PortArray @_typing.final class PortLike(_message.Message): """* Wrapper for different port like elements""" + DESCRIPTOR: _descriptor.Descriptor UNDEFINED_FIELD_NUMBER: _builtins.int LIB_ELEM_FIELD_NUMBER: _builtins.int @@ -264,36 +263,38 @@ class PortLike(_message.Message): ARRAY_FIELD_NUMBER: _builtins.int @_builtins.property - def undefined(self) -> _common_pb2.Empty: - ... - + def undefined(self) -> _common_pb2.Empty: ... @_builtins.property - def lib_elem(self) -> _ref_pb2.LibraryPath: - ... - + def lib_elem(self) -> _ref_pb2.LibraryPath: ... @_builtins.property def port(self) -> Global___Port: """* 'port' disallowed w/in the library""" @_builtins.property - def array(self) -> Global___PortArray: - ... + def array(self) -> Global___PortArray: ... + def __init__( + self, + *, + undefined: _common_pb2.Empty | None = ..., + lib_elem: _ref_pb2.LibraryPath | None = ..., + port: Global___Port | None = ..., + array: Global___PortArray | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal[ + "array", b"array", "is", b"is", "lib_elem", b"lib_elem", "port", b"port", "undefined", b"undefined" + ] - def __init__(self, *, undefined: _common_pb2.Empty | None=..., lib_elem: _ref_pb2.LibraryPath | None=..., port: Global___Port | None=..., array: Global___PortArray | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['array', b'array', 'is', b'is', 'lib_elem', b'lib_elem', 'port', b'port', 'undefined', b'undefined'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "array", b"array", "is", b"is", "lib_elem", b"lib_elem", "port", b"port", "undefined", b"undefined" + ] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['array', b'array', 'is', b'is', 'lib_elem', b'lib_elem', 'port', b'port', 'undefined', b'undefined'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_is: _TypeAlias = _typing.Literal["undefined", "lib_elem", "port", "array"] + _WhichOneofArgType_is: _TypeAlias = _typing.Literal["is", b"is"] - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... - _WhichOneofReturnType_is: _TypeAlias = _typing.Literal['undefined', 'lib_elem', 'port', 'array'] - _WhichOneofArgType_is: _TypeAlias = _typing.Literal['is', b'is'] + def WhichOneof(self, oneof_group: _WhichOneofArgType_is) -> _WhichOneofReturnType_is | None: ... - def WhichOneof(self, oneof_group: _WhichOneofArgType_is) -> _WhichOneofReturnType_is | None: - ... Global___PortLike: _TypeAlias = PortLike @_typing.final @@ -304,19 +305,15 @@ class Parameter(_message.Message): unit: _builtins.str @_builtins.property - def path(self) -> _ref_pb2.LocalPath: - ... + def path(self) -> _ref_pb2.LocalPath: ... + def __init__(self, *, path: _ref_pb2.LocalPath | None = ..., unit: _builtins.str = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["path", b"path"] - def __init__(self, *, path: _ref_pb2.LocalPath | None=..., unit: _builtins.str=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['path', b'path'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["path", b"path", "unit", b"unit"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['path', b'path', 'unit', b'unit'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___Parameter: _TypeAlias = Parameter @_typing.final @@ -327,24 +324,19 @@ class StringDescriptionElement(_message.Message): text: _builtins.str @_builtins.property - def param(self) -> Global___Parameter: - ... + def param(self) -> Global___Parameter: ... + def __init__(self, *, text: _builtins.str = ..., param: Global___Parameter | None = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["ElementType", b"ElementType", "param", b"param", "text", b"text"] - def __init__(self, *, text: _builtins.str=..., param: Global___Parameter | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['ElementType', b'ElementType', 'param', b'param', 'text', b'text'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["ElementType", b"ElementType", "param", b"param", "text", b"text"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['ElementType', b'ElementType', 'param', b'param', 'text', b'text'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_ElementType: _TypeAlias = _typing.Literal["text", "param"] + _WhichOneofArgType_ElementType: _TypeAlias = _typing.Literal["ElementType", b"ElementType"] - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... - _WhichOneofReturnType_ElementType: _TypeAlias = _typing.Literal['text', 'param'] - _WhichOneofArgType_ElementType: _TypeAlias = _typing.Literal['ElementType', b'ElementType'] + def WhichOneof(self, oneof_group: _WhichOneofArgType_ElementType) -> _WhichOneofReturnType_ElementType | None: ... - def WhichOneof(self, oneof_group: _WhichOneofArgType_ElementType) -> _WhichOneofReturnType_ElementType | None: - ... Global___StringDescriptionElement: _TypeAlias = StringDescriptionElement @_typing.final @@ -359,19 +351,15 @@ class HierarchyBlock(_message.Message): key: _builtins.str @_builtins.property - def value(self) -> _expr_pb2.ValueExpr: - ... + def value(self) -> _expr_pb2.ValueExpr: ... + def __init__(self, *, key: _builtins.str = ..., value: _expr_pb2.ValueExpr | None = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["value", b"value"] - def __init__(self, *, key: _builtins.str=..., value: _expr_pb2.ValueExpr | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['value', b'value'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["key", b"key", "value", b"value"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['key', b'key', 'value', b'value'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... PARAMS_FIELD_NUMBER: _builtins.int PARAM_DEFAULTS_FIELD_NUMBER: _builtins.int PORTS_FIELD_NUMBER: _builtins.int @@ -389,12 +377,10 @@ class HierarchyBlock(_message.Message): META_FIELD_NUMBER: _builtins.int DESCRIPTION_FIELD_NUMBER: _builtins.int is_abstract: _builtins.bool - 'true if self_class is abstract, and should error if used in a design' + "true if self_class is abstract, and should error if used in a design" @_builtins.property - def params(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedValInit]: - ... - + def params(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedValInit]: ... @_builtins.property def param_defaults(self) -> _containers.MessageMap[_builtins.str, _expr_pb2.ValueExpr]: """Refinements may introduce new parameters which would not be assigned a value in the parent class. @@ -403,9 +389,7 @@ class HierarchyBlock(_message.Message): """ @_builtins.property - def ports(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedPortLike]: - ... - + def ports(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedPortLike]: ... @_builtins.property def blocks(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedBlockLike]: """* Bridges, which adapt an edge port to a link port - eg, edge VoltageSink to an internal link @@ -414,9 +398,7 @@ class HierarchyBlock(_message.Message): """ @_builtins.property - def links(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedLinkLike]: - ... - + def links(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedLinkLike]: ... @_builtins.property def constraints(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedValueExpr]: """* Connections between internal block and link ports are represented by connected constraints. @@ -452,23 +434,80 @@ class HierarchyBlock(_message.Message): """optional default refinement subclass, only valid for library blocks""" @_builtins.property - def meta(self) -> _common_pb2.Metadata: - ... - - @_builtins.property - def description(self) -> _containers.RepeatedCompositeFieldContainer[Global___StringDescriptionElement]: - ... - - def __init__(self, *, params: _abc.Iterable[Global___NamedValInit] | None=..., param_defaults: _abc.Mapping[_builtins.str, _expr_pb2.ValueExpr] | None=..., ports: _abc.Iterable[Global___NamedPortLike] | None=..., blocks: _abc.Iterable[Global___NamedBlockLike] | None=..., links: _abc.Iterable[Global___NamedLinkLike] | None=..., constraints: _abc.Iterable[Global___NamedValueExpr] | None=..., self_class: _ref_pb2.LibraryPath | None=..., superclasses: _abc.Iterable[_ref_pb2.LibraryPath] | None=..., super_superclasses: _abc.Iterable[_ref_pb2.LibraryPath] | None=..., prerefine_class: _ref_pb2.LibraryPath | None=..., prerefine_mixins: _abc.Iterable[_ref_pb2.LibraryPath] | None=..., generator: Global___Generator | None=..., is_abstract: _builtins.bool=..., default_refinement: _ref_pb2.LibraryPath | None=..., meta: _common_pb2.Metadata | None=..., description: _abc.Iterable[Global___StringDescriptionElement] | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['default_refinement', b'default_refinement', 'generator', b'generator', 'meta', b'meta', 'prerefine_class', b'prerefine_class', 'self_class', b'self_class'] + def meta(self) -> _common_pb2.Metadata: ... + @_builtins.property + def description(self) -> _containers.RepeatedCompositeFieldContainer[Global___StringDescriptionElement]: ... + def __init__( + self, + *, + params: _abc.Iterable[Global___NamedValInit] | None = ..., + param_defaults: _abc.Mapping[_builtins.str, _expr_pb2.ValueExpr] | None = ..., + ports: _abc.Iterable[Global___NamedPortLike] | None = ..., + blocks: _abc.Iterable[Global___NamedBlockLike] | None = ..., + links: _abc.Iterable[Global___NamedLinkLike] | None = ..., + constraints: _abc.Iterable[Global___NamedValueExpr] | None = ..., + self_class: _ref_pb2.LibraryPath | None = ..., + superclasses: _abc.Iterable[_ref_pb2.LibraryPath] | None = ..., + super_superclasses: _abc.Iterable[_ref_pb2.LibraryPath] | None = ..., + prerefine_class: _ref_pb2.LibraryPath | None = ..., + prerefine_mixins: _abc.Iterable[_ref_pb2.LibraryPath] | None = ..., + generator: Global___Generator | None = ..., + is_abstract: _builtins.bool = ..., + default_refinement: _ref_pb2.LibraryPath | None = ..., + meta: _common_pb2.Metadata | None = ..., + description: _abc.Iterable[Global___StringDescriptionElement] | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal[ + "default_refinement", + b"default_refinement", + "generator", + b"generator", + "meta", + b"meta", + "prerefine_class", + b"prerefine_class", + "self_class", + b"self_class", + ] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "blocks", + b"blocks", + "constraints", + b"constraints", + "default_refinement", + b"default_refinement", + "description", + b"description", + "generator", + b"generator", + "is_abstract", + b"is_abstract", + "links", + b"links", + "meta", + b"meta", + "param_defaults", + b"param_defaults", + "params", + b"params", + "ports", + b"ports", + "prerefine_class", + b"prerefine_class", + "prerefine_mixins", + b"prerefine_mixins", + "self_class", + b"self_class", + "super_superclasses", + b"super_superclasses", + "superclasses", + b"superclasses", + ] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['blocks', b'blocks', 'constraints', b'constraints', 'default_refinement', b'default_refinement', 'description', b'description', 'generator', b'generator', 'is_abstract', b'is_abstract', 'links', b'links', 'meta', b'meta', 'param_defaults', b'param_defaults', 'params', b'params', 'ports', b'ports', 'prerefine_class', b'prerefine_class', 'prerefine_mixins', b'prerefine_mixins', 'self_class', b'self_class', 'super_superclasses', b'super_superclasses', 'superclasses', b'superclasses'] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___HierarchyBlock: _TypeAlias = HierarchyBlock @_typing.final @@ -482,12 +521,11 @@ class Generator(_message.Message): These parameters are the only ones accessible to the generator. """ - def __init__(self, *, required_params: _abc.Iterable[_ref_pb2.LocalPath] | None=...) -> None: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['required_params', b'required_params'] + def __init__(self, *, required_params: _abc.Iterable[_ref_pb2.LocalPath] | None = ...) -> None: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["required_params", b"required_params"] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___Generator: _TypeAlias = Generator @_typing.final @@ -497,23 +535,19 @@ class BlockLibrary(_message.Message): MIXINS_FIELD_NUMBER: _builtins.int @_builtins.property - def base(self) -> _ref_pb2.LibraryPath: - ... - + def base(self) -> _ref_pb2.LibraryPath: ... @_builtins.property - def mixins(self) -> _containers.RepeatedCompositeFieldContainer[_ref_pb2.LibraryPath]: - ... + def mixins(self) -> _containers.RepeatedCompositeFieldContainer[_ref_pb2.LibraryPath]: ... + def __init__( + self, *, base: _ref_pb2.LibraryPath | None = ..., mixins: _abc.Iterable[_ref_pb2.LibraryPath] | None = ... + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["base", b"base"] - def __init__(self, *, base: _ref_pb2.LibraryPath | None=..., mixins: _abc.Iterable[_ref_pb2.LibraryPath] | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['base', b'base'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["base", b"base", "mixins", b"mixins"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['base', b'base', 'mixins', b'mixins'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___BlockLibrary: _TypeAlias = BlockLibrary @_typing.final @@ -524,32 +558,35 @@ class BlockLike(_message.Message): HIERARCHY_FIELD_NUMBER: _builtins.int @_builtins.property - def undefined(self) -> _common_pb2.Empty: - ... - + def undefined(self) -> _common_pb2.Empty: ... @_builtins.property - def lib_elem(self) -> Global___BlockLibrary: - ... - + def lib_elem(self) -> Global___BlockLibrary: ... @_builtins.property def hierarchy(self) -> Global___HierarchyBlock: """* not allowed w/in the library""" - def __init__(self, *, undefined: _common_pb2.Empty | None=..., lib_elem: Global___BlockLibrary | None=..., hierarchy: Global___HierarchyBlock | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['hierarchy', b'hierarchy', 'lib_elem', b'lib_elem', 'type', b'type', 'undefined', b'undefined'] + def __init__( + self, + *, + undefined: _common_pb2.Empty | None = ..., + lib_elem: Global___BlockLibrary | None = ..., + hierarchy: Global___HierarchyBlock | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal[ + "hierarchy", b"hierarchy", "lib_elem", b"lib_elem", "type", b"type", "undefined", b"undefined" + ] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "hierarchy", b"hierarchy", "lib_elem", b"lib_elem", "type", b"type", "undefined", b"undefined" + ] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['hierarchy', b'hierarchy', 'lib_elem', b'lib_elem', 'type', b'type', 'undefined', b'undefined'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_type: _TypeAlias = _typing.Literal["undefined", "lib_elem", "hierarchy"] + _WhichOneofArgType_type: _TypeAlias = _typing.Literal["type", b"type"] - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... - _WhichOneofReturnType_type: _TypeAlias = _typing.Literal['undefined', 'lib_elem', 'hierarchy'] - _WhichOneofArgType_type: _TypeAlias = _typing.Literal['type', b'type'] + def WhichOneof(self, oneof_group: _WhichOneofArgType_type) -> _WhichOneofReturnType_type | None: ... - def WhichOneof(self, oneof_group: _WhichOneofArgType_type) -> _WhichOneofReturnType_type | None: - ... Global___BlockLike: _TypeAlias = BlockLike @_typing.final @@ -566,25 +603,15 @@ class Link(_message.Message): DESCRIPTION_FIELD_NUMBER: _builtins.int @_builtins.property - def params(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedValInit]: - ... - + def params(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedValInit]: ... @_builtins.property - def ports(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedPortLike]: - ... - + def ports(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedPortLike]: ... @_builtins.property - def links(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedLinkLike]: - ... - + def links(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedLinkLike]: ... @_builtins.property - def constraints(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedValueExpr]: - ... - + def constraints(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedValueExpr]: ... @_builtins.property - def self_class(self) -> _ref_pb2.LibraryPath: - ... - + def self_class(self) -> _ref_pb2.LibraryPath: ... @_builtins.property def superclasses(self) -> _containers.RepeatedCompositeFieldContainer[_ref_pb2.LibraryPath]: """superclasses, may be empty""" @@ -598,19 +625,46 @@ class Link(_message.Message): """TODO: this provides type hierarchy data only, inheritance semantics are currently undefined""" @_builtins.property - def description(self) -> _containers.RepeatedCompositeFieldContainer[Global___StringDescriptionElement]: - ... - - def __init__(self, *, params: _abc.Iterable[Global___NamedValInit] | None=..., ports: _abc.Iterable[Global___NamedPortLike] | None=..., links: _abc.Iterable[Global___NamedLinkLike] | None=..., constraints: _abc.Iterable[Global___NamedValueExpr] | None=..., self_class: _ref_pb2.LibraryPath | None=..., superclasses: _abc.Iterable[_ref_pb2.LibraryPath] | None=..., super_superclasses: _abc.Iterable[_ref_pb2.LibraryPath] | None=..., meta: _common_pb2.Metadata | None=..., description: _abc.Iterable[Global___StringDescriptionElement] | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta', 'self_class', b'self_class'] + def description(self) -> _containers.RepeatedCompositeFieldContainer[Global___StringDescriptionElement]: ... + def __init__( + self, + *, + params: _abc.Iterable[Global___NamedValInit] | None = ..., + ports: _abc.Iterable[Global___NamedPortLike] | None = ..., + links: _abc.Iterable[Global___NamedLinkLike] | None = ..., + constraints: _abc.Iterable[Global___NamedValueExpr] | None = ..., + self_class: _ref_pb2.LibraryPath | None = ..., + superclasses: _abc.Iterable[_ref_pb2.LibraryPath] | None = ..., + super_superclasses: _abc.Iterable[_ref_pb2.LibraryPath] | None = ..., + meta: _common_pb2.Metadata | None = ..., + description: _abc.Iterable[Global___StringDescriptionElement] | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta", "self_class", b"self_class"] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "constraints", + b"constraints", + "description", + b"description", + "links", + b"links", + "meta", + b"meta", + "params", + b"params", + "ports", + b"ports", + "self_class", + b"self_class", + "super_superclasses", + b"super_superclasses", + "superclasses", + b"superclasses", + ] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['constraints', b'constraints', 'description', b'description', 'links', b'links', 'meta', b'meta', 'params', b'params', 'ports', b'ports', 'self_class', b'self_class', 'super_superclasses', b'super_superclasses', 'superclasses', b'superclasses'] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___Link: _TypeAlias = Link @_typing.final @@ -639,23 +693,36 @@ class LinkArray(_message.Message): """includes all exported constraints to map link ports to my ports""" @_builtins.property - def links(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedLinkLike]: - ... + def links(self) -> _containers.RepeatedCompositeFieldContainer[Global___NamedLinkLike]: ... + @_builtins.property + def meta(self) -> _common_pb2.Metadata: ... + def __init__( + self, + *, + self_class: _ref_pb2.LibraryPath | None = ..., + ports: _abc.Iterable[Global___NamedPortLike] | None = ..., + constraints: _abc.Iterable[Global___NamedValueExpr] | None = ..., + links: _abc.Iterable[Global___NamedLinkLike] | None = ..., + meta: _common_pb2.Metadata | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta", "self_class", b"self_class"] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "constraints", + b"constraints", + "links", + b"links", + "meta", + b"meta", + "ports", + b"ports", + "self_class", + b"self_class", + ] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - @_builtins.property - def meta(self) -> _common_pb2.Metadata: - ... - - def __init__(self, *, self_class: _ref_pb2.LibraryPath | None=..., ports: _abc.Iterable[Global___NamedPortLike] | None=..., constraints: _abc.Iterable[Global___NamedValueExpr] | None=..., links: _abc.Iterable[Global___NamedLinkLike] | None=..., meta: _common_pb2.Metadata | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta', 'self_class', b'self_class'] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['constraints', b'constraints', 'links', b'links', 'meta', b'meta', 'ports', b'ports', 'self_class', b'self_class'] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___LinkArray: _TypeAlias = LinkArray @_typing.final @@ -667,34 +734,36 @@ class LinkLike(_message.Message): ARRAY_FIELD_NUMBER: _builtins.int @_builtins.property - def undefined(self) -> _common_pb2.Empty: - ... - + def undefined(self) -> _common_pb2.Empty: ... @_builtins.property - def lib_elem(self) -> _ref_pb2.LibraryPath: - ... - + def lib_elem(self) -> _ref_pb2.LibraryPath: ... @_builtins.property def link(self) -> Global___Link: """* not allowed w/in the library""" @_builtins.property - def array(self) -> Global___LinkArray: - ... + def array(self) -> Global___LinkArray: ... + def __init__( + self, + *, + undefined: _common_pb2.Empty | None = ..., + lib_elem: _ref_pb2.LibraryPath | None = ..., + link: Global___Link | None = ..., + array: Global___LinkArray | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal[ + "array", b"array", "lib_elem", b"lib_elem", "link", b"link", "type", b"type", "undefined", b"undefined" + ] - def __init__(self, *, undefined: _common_pb2.Empty | None=..., lib_elem: _ref_pb2.LibraryPath | None=..., link: Global___Link | None=..., array: Global___LinkArray | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['array', b'array', 'lib_elem', b'lib_elem', 'link', b'link', 'type', b'type', 'undefined', b'undefined'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "array", b"array", "lib_elem", b"lib_elem", "link", b"link", "type", b"type", "undefined", b"undefined" + ] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['array', b'array', 'lib_elem', b'lib_elem', 'link', b'link', 'type', b'type', 'undefined', b'undefined'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_type: _TypeAlias = _typing.Literal["undefined", "lib_elem", "link", "array"] + _WhichOneofArgType_type: _TypeAlias = _typing.Literal["type", b"type"] - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... - _WhichOneofReturnType_type: _TypeAlias = _typing.Literal['undefined', 'lib_elem', 'link', 'array'] - _WhichOneofArgType_type: _TypeAlias = _typing.Literal['type', b'type'] + def WhichOneof(self, oneof_group: _WhichOneofArgType_type) -> _WhichOneofReturnType_type | None: ... - def WhichOneof(self, oneof_group: _WhichOneofArgType_type) -> _WhichOneofReturnType_type | None: - ... -Global___LinkLike: _TypeAlias = LinkLike \ No newline at end of file +Global___LinkLike: _TypeAlias = LinkLike diff --git a/edg/edgir/expr_pb2.py b/edg/edgir/expr_pb2.py index db1910d84..9bc92c74b 100644 --- a/edg/edgir/expr_pb2.py +++ b/edg/edgir/expr_pb2.py @@ -1,19 +1,24 @@ """Generated protocol buffer code.""" + from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database + _sym_db = _symbol_database.Default() from ..edgir import ref_pb2 as edgir_dot_ref__pb2 from ..edgir import common_pb2 as edgir_dot_common__pb2 from ..edgir import lit_pb2 as edgir_dot_lit__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10edgir/expr.proto\x12\nedgir.expr\x1a\x0fedgir/ref.proto\x1a\x12edgir/common.proto\x1a\x0fedgir/lit.proto"\xb4\x01\n\tUnaryExpr\x12$\n\x02op\x18\x01 \x01(\x0e2\x18.edgir.expr.UnaryExpr.Op\x12"\n\x03val\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr"]\n\x02Op\x12\r\n\tUNDEFINED\x10\x00\x12\n\n\x06NEGATE\x10\x01\x12\x07\n\x03NOT\x10\x02\x12\n\n\x06INVERT\x10\x03\x12\x07\n\x03MIN\x10\x04\x12\x07\n\x03MAX\x10\x05\x12\n\n\x06CENTER\x10\x06\x12\t\n\x05WIDTH\x10\x07"\x9f\x02\n\x0cUnarySetExpr\x12\'\n\x02op\x18\x01 \x01(\x0e2\x1b.edgir.expr.UnarySetExpr.Op\x12#\n\x04vals\x18\x04 \x01(\x0b2\x15.edgir.expr.ValueExpr"\xc0\x01\n\x02Op\x12\r\n\tUNDEFINED\x10\x00\x12\x07\n\x03SUM\x10\x01\x12\x0c\n\x08ALL_TRUE\x10\x02\x12\x0c\n\x08ANY_TRUE\x10\x03\x12\n\n\x06ALL_EQ\x10\x04\x12\x0e\n\nALL_UNIQUE\x10\x05\x12\x0b\n\x07MAXIMUM\x10\n\x12\x0b\n\x07MINIMUM\x10\x0b\x12\x0f\n\x0bSET_EXTRACT\x10\x0c\x12\x10\n\x0cINTERSECTION\x10\r\x12\x08\n\x04HULL\x10\x0e\x12\n\n\x06NEGATE\x10\x14\x12\n\n\x06INVERT\x10\x15\x12\x0b\n\x07FLATTEN\x10\x1e"\xd4\x02\n\nBinaryExpr\x12%\n\x02op\x18\x01 \x01(\x0e2\x19.edgir.expr.BinaryExpr.Op\x12"\n\x03lhs\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12"\n\x03rhs\x18\x03 \x01(\x0b2\x15.edgir.expr.ValueExpr"\xd6\x01\n\x02Op\x12\r\n\tUNDEFINED\x10\x00\x12\x07\n\x03ADD\x10\n\x12\x08\n\x04MULT\x10\x0c\x12\x0f\n\x0bSHRINK_MULT\x107\x12\x07\n\x03AND\x10\x14\x12\x06\n\x02OR\x10\x15\x12\x07\n\x03XOR\x10\x16\x12\x0b\n\x07IMPLIES\x10\x17\x12\x06\n\x02EQ\x10\x1e\x12\x07\n\x03NEQ\x10\x1f\x12\x06\n\x02GT\x10(\x12\x07\n\x03GTE\x10)\x12\x06\n\x02LT\x10*\x12\x07\n\x03LTE\x10,\x12\x07\n\x03MAX\x10-\x12\x07\n\x03MIN\x10.\x12\x10\n\x0cINTERSECTION\x103\x12\x08\n\x04HULL\x106\x12\n\n\x06WITHIN\x105\x12\t\n\x05RANGE\x10\x01"\xbf\x01\n\rBinarySetExpr\x12(\n\x02op\x18\x01 \x01(\x0e2\x1c.edgir.expr.BinarySetExpr.Op\x12$\n\x05lhset\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12"\n\x03rhs\x18\x03 \x01(\x0b2\x15.edgir.expr.ValueExpr":\n\x02Op\x12\r\n\tUNDEFINED\x10\x00\x12\x07\n\x03ADD\x10\n\x12\x08\n\x04MULT\x10\x0c\x12\n\n\x06CONCAT\x10\x14\x12\x06\n\x02EQ\x10\x1e"0\n\tArrayExpr\x12#\n\x04vals\x18\x01 \x03(\x0b2\x15.edgir.expr.ValueExpr"[\n\tRangeExpr\x12&\n\x07minimum\x18\x01 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12&\n\x07maximum\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr"\x80\x01\n\nStructExpr\x12.\n\x04vals\x18\x01 \x03(\x0b2 .edgir.expr.StructExpr.ValsEntry\x1aB\n\tValsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr:\x028\x01"\xa3\x01\n\x0eIfThenElseExpr\x12#\n\x04cond\x18\x01 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12"\n\x03tru\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12"\n\x03fal\x18\x03 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata"]\n\x0bExtractExpr\x12(\n\tcontainer\x18\x01 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12$\n\x05index\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr"^\n\x0eMapExtractExpr\x12(\n\tcontainer\x18\x01 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12"\n\x04path\x18\x02 \x01(\x0b2\x14.edgir.ref.LocalPath"\x91\x01\n\rConnectedExpr\x12)\n\nblock_port\x18\x01 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12(\n\tlink_port\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12+\n\x08expanded\x18\x03 \x03(\x0b2\x19.edgir.expr.ConnectedExpr"\x9c\x01\n\x0cExportedExpr\x12,\n\rexterior_port\x18\x01 \x01(\x0b2\x15.edgir.expr.ValueExpr\x122\n\x13internal_block_port\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12*\n\x08expanded\x18\x03 \x03(\x0b2\x18.edgir.expr.ExportedExpr"S\n\nAssignExpr\x12!\n\x03dst\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12"\n\x03src\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr"\x97\x07\n\tValueExpr\x12&\n\x07literal\x18\x01 \x01(\x0b2\x13.edgir.lit.ValueLitH\x00\x12(\n\x06binary\x18\x02 \x01(\x0b2\x16.edgir.expr.BinaryExprH\x00\x12/\n\nbinary_set\x18\x12 \x01(\x0b2\x19.edgir.expr.BinarySetExprH\x00\x12&\n\x05unary\x18\x03 \x01(\x0b2\x15.edgir.expr.UnaryExprH\x00\x12-\n\tunary_set\x18\x04 \x01(\x0b2\x18.edgir.expr.UnarySetExprH\x00\x12&\n\x05array\x18\x06 \x01(\x0b2\x15.edgir.expr.ArrayExprH\x00\x12(\n\x06struct\x18\x07 \x01(\x0b2\x16.edgir.expr.StructExprH\x00\x12&\n\x05range\x18\x08 \x01(\x0b2\x15.edgir.expr.RangeExprH\x00\x120\n\nifThenElse\x18\n \x01(\x0b2\x1a.edgir.expr.IfThenElseExprH\x00\x12*\n\x07extract\x18\x0c \x01(\x0b2\x17.edgir.expr.ExtractExprH\x00\x121\n\x0bmap_extract\x18\x0e \x01(\x0b2\x1a.edgir.expr.MapExtractExprH\x00\x12.\n\tconnected\x18\x0f \x01(\x0b2\x19.edgir.expr.ConnectedExprH\x00\x12,\n\x08exported\x18\x10 \x01(\x0b2\x18.edgir.expr.ExportedExprH\x00\x123\n\x0econnectedArray\x18\x13 \x01(\x0b2\x19.edgir.expr.ConnectedExprH\x00\x121\n\rexportedArray\x18\x14 \x01(\x0b2\x18.edgir.expr.ExportedExprH\x00\x12(\n\x06assign\x18\x11 \x01(\x0b2\x16.edgir.expr.AssignExprH\x00\x122\n\x0eexportedTunnel\x18\x15 \x01(\x0b2\x18.edgir.expr.ExportedExprH\x00\x12.\n\x0cassignTunnel\x18\x16 \x01(\x0b2\x16.edgir.expr.AssignExprH\x00\x12#\n\x03ref\x18c \x01(\x0b2\x14.edgir.ref.LocalPathH\x00\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.MetadataB\x06\n\x04exprb\x06proto3') + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n\x10edgir/expr.proto\x12\nedgir.expr\x1a\x0fedgir/ref.proto\x1a\x12edgir/common.proto\x1a\x0fedgir/lit.proto"\xb4\x01\n\tUnaryExpr\x12$\n\x02op\x18\x01 \x01(\x0e2\x18.edgir.expr.UnaryExpr.Op\x12"\n\x03val\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr"]\n\x02Op\x12\r\n\tUNDEFINED\x10\x00\x12\n\n\x06NEGATE\x10\x01\x12\x07\n\x03NOT\x10\x02\x12\n\n\x06INVERT\x10\x03\x12\x07\n\x03MIN\x10\x04\x12\x07\n\x03MAX\x10\x05\x12\n\n\x06CENTER\x10\x06\x12\t\n\x05WIDTH\x10\x07"\x9f\x02\n\x0cUnarySetExpr\x12\'\n\x02op\x18\x01 \x01(\x0e2\x1b.edgir.expr.UnarySetExpr.Op\x12#\n\x04vals\x18\x04 \x01(\x0b2\x15.edgir.expr.ValueExpr"\xc0\x01\n\x02Op\x12\r\n\tUNDEFINED\x10\x00\x12\x07\n\x03SUM\x10\x01\x12\x0c\n\x08ALL_TRUE\x10\x02\x12\x0c\n\x08ANY_TRUE\x10\x03\x12\n\n\x06ALL_EQ\x10\x04\x12\x0e\n\nALL_UNIQUE\x10\x05\x12\x0b\n\x07MAXIMUM\x10\n\x12\x0b\n\x07MINIMUM\x10\x0b\x12\x0f\n\x0bSET_EXTRACT\x10\x0c\x12\x10\n\x0cINTERSECTION\x10\r\x12\x08\n\x04HULL\x10\x0e\x12\n\n\x06NEGATE\x10\x14\x12\n\n\x06INVERT\x10\x15\x12\x0b\n\x07FLATTEN\x10\x1e"\xd4\x02\n\nBinaryExpr\x12%\n\x02op\x18\x01 \x01(\x0e2\x19.edgir.expr.BinaryExpr.Op\x12"\n\x03lhs\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12"\n\x03rhs\x18\x03 \x01(\x0b2\x15.edgir.expr.ValueExpr"\xd6\x01\n\x02Op\x12\r\n\tUNDEFINED\x10\x00\x12\x07\n\x03ADD\x10\n\x12\x08\n\x04MULT\x10\x0c\x12\x0f\n\x0bSHRINK_MULT\x107\x12\x07\n\x03AND\x10\x14\x12\x06\n\x02OR\x10\x15\x12\x07\n\x03XOR\x10\x16\x12\x0b\n\x07IMPLIES\x10\x17\x12\x06\n\x02EQ\x10\x1e\x12\x07\n\x03NEQ\x10\x1f\x12\x06\n\x02GT\x10(\x12\x07\n\x03GTE\x10)\x12\x06\n\x02LT\x10*\x12\x07\n\x03LTE\x10,\x12\x07\n\x03MAX\x10-\x12\x07\n\x03MIN\x10.\x12\x10\n\x0cINTERSECTION\x103\x12\x08\n\x04HULL\x106\x12\n\n\x06WITHIN\x105\x12\t\n\x05RANGE\x10\x01"\xbf\x01\n\rBinarySetExpr\x12(\n\x02op\x18\x01 \x01(\x0e2\x1c.edgir.expr.BinarySetExpr.Op\x12$\n\x05lhset\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12"\n\x03rhs\x18\x03 \x01(\x0b2\x15.edgir.expr.ValueExpr":\n\x02Op\x12\r\n\tUNDEFINED\x10\x00\x12\x07\n\x03ADD\x10\n\x12\x08\n\x04MULT\x10\x0c\x12\n\n\x06CONCAT\x10\x14\x12\x06\n\x02EQ\x10\x1e"0\n\tArrayExpr\x12#\n\x04vals\x18\x01 \x03(\x0b2\x15.edgir.expr.ValueExpr"[\n\tRangeExpr\x12&\n\x07minimum\x18\x01 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12&\n\x07maximum\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr"\x80\x01\n\nStructExpr\x12.\n\x04vals\x18\x01 \x03(\x0b2 .edgir.expr.StructExpr.ValsEntry\x1aB\n\tValsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr:\x028\x01"\xa3\x01\n\x0eIfThenElseExpr\x12#\n\x04cond\x18\x01 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12"\n\x03tru\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12"\n\x03fal\x18\x03 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata"]\n\x0bExtractExpr\x12(\n\tcontainer\x18\x01 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12$\n\x05index\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr"^\n\x0eMapExtractExpr\x12(\n\tcontainer\x18\x01 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12"\n\x04path\x18\x02 \x01(\x0b2\x14.edgir.ref.LocalPath"\x91\x01\n\rConnectedExpr\x12)\n\nblock_port\x18\x01 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12(\n\tlink_port\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12+\n\x08expanded\x18\x03 \x03(\x0b2\x19.edgir.expr.ConnectedExpr"\x9c\x01\n\x0cExportedExpr\x12,\n\rexterior_port\x18\x01 \x01(\x0b2\x15.edgir.expr.ValueExpr\x122\n\x13internal_block_port\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr\x12*\n\x08expanded\x18\x03 \x03(\x0b2\x18.edgir.expr.ExportedExpr"S\n\nAssignExpr\x12!\n\x03dst\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12"\n\x03src\x18\x02 \x01(\x0b2\x15.edgir.expr.ValueExpr"\x97\x07\n\tValueExpr\x12&\n\x07literal\x18\x01 \x01(\x0b2\x13.edgir.lit.ValueLitH\x00\x12(\n\x06binary\x18\x02 \x01(\x0b2\x16.edgir.expr.BinaryExprH\x00\x12/\n\nbinary_set\x18\x12 \x01(\x0b2\x19.edgir.expr.BinarySetExprH\x00\x12&\n\x05unary\x18\x03 \x01(\x0b2\x15.edgir.expr.UnaryExprH\x00\x12-\n\tunary_set\x18\x04 \x01(\x0b2\x18.edgir.expr.UnarySetExprH\x00\x12&\n\x05array\x18\x06 \x01(\x0b2\x15.edgir.expr.ArrayExprH\x00\x12(\n\x06struct\x18\x07 \x01(\x0b2\x16.edgir.expr.StructExprH\x00\x12&\n\x05range\x18\x08 \x01(\x0b2\x15.edgir.expr.RangeExprH\x00\x120\n\nifThenElse\x18\n \x01(\x0b2\x1a.edgir.expr.IfThenElseExprH\x00\x12*\n\x07extract\x18\x0c \x01(\x0b2\x17.edgir.expr.ExtractExprH\x00\x121\n\x0bmap_extract\x18\x0e \x01(\x0b2\x1a.edgir.expr.MapExtractExprH\x00\x12.\n\tconnected\x18\x0f \x01(\x0b2\x19.edgir.expr.ConnectedExprH\x00\x12,\n\x08exported\x18\x10 \x01(\x0b2\x18.edgir.expr.ExportedExprH\x00\x123\n\x0econnectedArray\x18\x13 \x01(\x0b2\x19.edgir.expr.ConnectedExprH\x00\x121\n\rexportedArray\x18\x14 \x01(\x0b2\x18.edgir.expr.ExportedExprH\x00\x12(\n\x06assign\x18\x11 \x01(\x0b2\x16.edgir.expr.AssignExprH\x00\x122\n\x0eexportedTunnel\x18\x15 \x01(\x0b2\x18.edgir.expr.ExportedExprH\x00\x12.\n\x0cassignTunnel\x18\x16 \x01(\x0b2\x16.edgir.expr.AssignExprH\x00\x12#\n\x03ref\x18c \x01(\x0b2\x14.edgir.ref.LocalPathH\x00\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.MetadataB\x06\n\x04exprb\x06proto3' +) _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'edgir.expr_pb2', globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "edgir.expr_pb2", globals()) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None _STRUCTEXPR_VALSENTRY._options = None - _STRUCTEXPR_VALSENTRY._serialized_options = b'8\x01' + _STRUCTEXPR_VALSENTRY._serialized_options = b"8\x01" _UNARYEXPR._serialized_start = 87 _UNARYEXPR._serialized_end = 267 _UNARYEXPR_OP._serialized_start = 174 @@ -51,4 +56,4 @@ _ASSIGNEXPR._serialized_start = 2034 _ASSIGNEXPR._serialized_end = 2117 _VALUEEXPR._serialized_start = 2120 - _VALUEEXPR._serialized_end = 3039 \ No newline at end of file + _VALUEEXPR._serialized_end = 3039 diff --git a/edg/edgir/expr_pb2.pyi b/edg/edgir/expr_pb2.pyi index 2d1e15315..5ef2e0b8f 100644 --- a/edg/edgir/expr_pb2.pyi +++ b/edg/edgir/expr_pb2.pyi @@ -25,6 +25,7 @@ in a small number number of places to help classify types into groups. I don't think we should be using sorts at all in this module, but it's defined for the sake on completeness. """ + from collections import abc as _abc from edgir import common_pb2 as _common_pb2 from edgir import lit_pb2 as _lit_pb2 @@ -36,6 +37,7 @@ from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper import builtins as _builtins import sys import typing as _typing + if sys.version_info >= (3, 10): from typing import TypeAlias as _TypeAlias else: @@ -47,62 +49,57 @@ class UnaryExpr(_message.Message): DESCRIPTOR: _descriptor.Descriptor class _Op: - ValueType = _typing.NewType('ValueType', _builtins.int) + ValueType = _typing.NewType("ValueType", _builtins.int) V: _TypeAlias = ValueType class _OpEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[UnaryExpr._Op.ValueType], _builtins.type): DESCRIPTOR: _descriptor.EnumDescriptor UNDEFINED: UnaryExpr._Op.ValueType NEGATE: UnaryExpr._Op.ValueType - '* Negate :: Numeric a => a -> a\n :: Numeric a => Range a -> Range a\n ' + "* Negate :: Numeric a => a -> a\n :: Numeric a => Range a -> Range a\n " NOT: UnaryExpr._Op.ValueType - '* Not :: Bool -> Bool' + "* Not :: Bool -> Bool" INVERT: UnaryExpr._Op.ValueType - '* Invert :: Float -> Float\n :: Range Float -> Range Float\n ' + "* Invert :: Float -> Float\n :: Range Float -> Range Float\n " MIN: UnaryExpr._Op.ValueType - '* Min :: Range a -> a' + "* Min :: Range a -> a" MAX: UnaryExpr._Op.ValueType - '* Max :: Range a -> a' + "* Max :: Range a -> a" CENTER: UnaryExpr._Op.ValueType - '* Center :: Range a -> a' + "* Center :: Range a -> a" WIDTH: UnaryExpr._Op.ValueType - '* Width :: Range a -> a' + "* Width :: Range a -> a" - class Op(_Op, metaclass=_OpEnumTypeWrapper): - ... + class Op(_Op, metaclass=_OpEnumTypeWrapper): ... UNDEFINED: UnaryExpr.Op.ValueType NEGATE: UnaryExpr.Op.ValueType - '* Negate :: Numeric a => a -> a\n :: Numeric a => Range a -> Range a\n ' + "* Negate :: Numeric a => a -> a\n :: Numeric a => Range a -> Range a\n " NOT: UnaryExpr.Op.ValueType - '* Not :: Bool -> Bool' + "* Not :: Bool -> Bool" INVERT: UnaryExpr.Op.ValueType - '* Invert :: Float -> Float\n :: Range Float -> Range Float\n ' + "* Invert :: Float -> Float\n :: Range Float -> Range Float\n " MIN: UnaryExpr.Op.ValueType - '* Min :: Range a -> a' + "* Min :: Range a -> a" MAX: UnaryExpr.Op.ValueType - '* Max :: Range a -> a' + "* Max :: Range a -> a" CENTER: UnaryExpr.Op.ValueType - '* Center :: Range a -> a' + "* Center :: Range a -> a" WIDTH: UnaryExpr.Op.ValueType - '* Width :: Range a -> a' + "* Width :: Range a -> a" OP_FIELD_NUMBER: _builtins.int VAL_FIELD_NUMBER: _builtins.int op: Global___UnaryExpr.Op.ValueType @_builtins.property - def val(self) -> Global___ValueExpr: - ... + def val(self) -> Global___ValueExpr: ... + def __init__(self, *, op: Global___UnaryExpr.Op.ValueType = ..., val: Global___ValueExpr | None = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["val", b"val"] - def __init__(self, *, op: Global___UnaryExpr.Op.ValueType=..., val: Global___ValueExpr | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['val', b'val'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["op", b"op", "val", b"val"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['op', b'op', 'val', b'val'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___UnaryExpr: _TypeAlias = UnaryExpr @_typing.final @@ -110,86 +107,83 @@ class UnarySetExpr(_message.Message): DESCRIPTOR: _descriptor.Descriptor class _Op: - ValueType = _typing.NewType('ValueType', _builtins.int) + ValueType = _typing.NewType("ValueType", _builtins.int) V: _TypeAlias = ValueType class _OpEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[UnarySetExpr._Op.ValueType], _builtins.type): DESCRIPTOR: _descriptor.EnumDescriptor UNDEFINED: UnarySetExpr._Op.ValueType SUM: UnarySetExpr._Op.ValueType - '* Sum :: (Numeric a) => Set a -> a\n :: (Numeric a) => Set (Range a) -> Range a\n\n Sum({}) = 0\n ' + "* Sum :: (Numeric a) => Set a -> a\n :: (Numeric a) => Set (Range a) -> Range a\n\n Sum({}) = 0\n " ALL_TRUE: UnarySetExpr._Op.ValueType - '* All :: Set Bool -> Bool\n\n All inputs are true\n All({}) = True\n ' + "* All :: Set Bool -> Bool\n\n All inputs are true\n All({}) = True\n " ANY_TRUE: UnarySetExpr._Op.ValueType - '* Any :: Set Bool -> Bool\n\n Any of the inputs are true\n Any({}) = False\n ' + "* Any :: Set Bool -> Bool\n\n Any of the inputs are true\n Any({}) = False\n " ALL_EQ: UnarySetExpr._Op.ValueType - '* AllEq :: (Equality a) => Set a -> Bool\n\n AllEq({}) = True\n ' + "* AllEq :: (Equality a) => Set a -> Bool\n\n AllEq({}) = True\n " ALL_UNIQUE: UnarySetExpr._Op.ValueType - '* AllUnique :: (Equality a) => Set a -> Bool\n\n AllUnique(EmptySet) = True\n ' + "* AllUnique :: (Equality a) => Set a -> Bool\n\n AllUnique(EmptySet) = True\n " MAXIMUM: UnarySetExpr._Op.ValueType - 'SIZE = 6;\n\n * Maximum :: (Ordered a) => Set a -> a\n\n This op requires that the non-emptyness of the relevant set is assured\n before being valid.\n ' + "SIZE = 6;\n\n * Maximum :: (Ordered a) => Set a -> a\n\n This op requires that the non-emptyness of the relevant set is assured\n before being valid.\n " MINIMUM: UnarySetExpr._Op.ValueType - '* Minimum :: (Ordered a) => Set a -> a\n\n This op requires that the non-emptyness of the relevant set is assured\n before being valid.\n ' + "* Minimum :: (Ordered a) => Set a -> a\n\n This op requires that the non-emptyness of the relevant set is assured\n before being valid.\n " SET_EXTRACT: UnarySetExpr._Op.ValueType - '* SetExtract :: Set a -> a\n\n This op requires that the non-emptyness of the relevant set is assured\n before being valid. In addition this assumes all values in the set are equal.\n ' + "* SetExtract :: Set a -> a\n\n This op requires that the non-emptyness of the relevant set is assured\n before being valid. In addition this assumes all values in the set are equal.\n " INTERSECTION: UnarySetExpr._Op.ValueType - '* Intersection :: Set (Range a) -> Range a\n\n May produce an empty range.\n Intersection({}) = [-inf, +inf]\n ' + "* Intersection :: Set (Range a) -> Range a\n\n May produce an empty range.\n Intersection({}) = [-inf, +inf]\n " HULL: UnarySetExpr._Op.ValueType - '* Hull :: Set (Range a) -> Range a\n Returns the convex hull (union with all the inner missing bits filled in)\n Hull({}) = EmptyRange\n ' + "* Hull :: Set (Range a) -> Range a\n Returns the convex hull (union with all the inner missing bits filled in)\n Hull({}) = EmptyRange\n " NEGATE: UnarySetExpr._Op.ValueType - '* Negate :: Numeric a => Set a -> Set a\n :: Numeric a => Set (Range a) -> Set (Range a)\n\n Pointwise negate\n ' + "* Negate :: Numeric a => Set a -> Set a\n :: Numeric a => Set (Range a) -> Set (Range a)\n\n Pointwise negate\n " INVERT: UnarySetExpr._Op.ValueType - '* Invert :: Set Float -> Set Float\n :: Set (Range Float) -> Set (Range Float)\n\n Pointwise Invert\n ' + "* Invert :: Set Float -> Set Float\n :: Set (Range Float) -> Set (Range Float)\n\n Pointwise Invert\n " FLATTEN: UnarySetExpr._Op.ValueType - 'Flatten[A] : Set[Set[A]] -> Set[A]\n Given an array of array of elements, flattens the inner array.\n Alternatively stated, concatenates all of the elements of the outer arrary\n ' + "Flatten[A] : Set[Set[A]] -> Set[A]\n Given an array of array of elements, flattens the inner array.\n Alternatively stated, concatenates all of the elements of the outer arrary\n " - class Op(_Op, metaclass=_OpEnumTypeWrapper): - ... + class Op(_Op, metaclass=_OpEnumTypeWrapper): ... UNDEFINED: UnarySetExpr.Op.ValueType SUM: UnarySetExpr.Op.ValueType - '* Sum :: (Numeric a) => Set a -> a\n :: (Numeric a) => Set (Range a) -> Range a\n\n Sum({}) = 0\n ' + "* Sum :: (Numeric a) => Set a -> a\n :: (Numeric a) => Set (Range a) -> Range a\n\n Sum({}) = 0\n " ALL_TRUE: UnarySetExpr.Op.ValueType - '* All :: Set Bool -> Bool\n\n All inputs are true\n All({}) = True\n ' + "* All :: Set Bool -> Bool\n\n All inputs are true\n All({}) = True\n " ANY_TRUE: UnarySetExpr.Op.ValueType - '* Any :: Set Bool -> Bool\n\n Any of the inputs are true\n Any({}) = False\n ' + "* Any :: Set Bool -> Bool\n\n Any of the inputs are true\n Any({}) = False\n " ALL_EQ: UnarySetExpr.Op.ValueType - '* AllEq :: (Equality a) => Set a -> Bool\n\n AllEq({}) = True\n ' + "* AllEq :: (Equality a) => Set a -> Bool\n\n AllEq({}) = True\n " ALL_UNIQUE: UnarySetExpr.Op.ValueType - '* AllUnique :: (Equality a) => Set a -> Bool\n\n AllUnique(EmptySet) = True\n ' + "* AllUnique :: (Equality a) => Set a -> Bool\n\n AllUnique(EmptySet) = True\n " MAXIMUM: UnarySetExpr.Op.ValueType - 'SIZE = 6;\n\n * Maximum :: (Ordered a) => Set a -> a\n\n This op requires that the non-emptyness of the relevant set is assured\n before being valid.\n ' + "SIZE = 6;\n\n * Maximum :: (Ordered a) => Set a -> a\n\n This op requires that the non-emptyness of the relevant set is assured\n before being valid.\n " MINIMUM: UnarySetExpr.Op.ValueType - '* Minimum :: (Ordered a) => Set a -> a\n\n This op requires that the non-emptyness of the relevant set is assured\n before being valid.\n ' + "* Minimum :: (Ordered a) => Set a -> a\n\n This op requires that the non-emptyness of the relevant set is assured\n before being valid.\n " SET_EXTRACT: UnarySetExpr.Op.ValueType - '* SetExtract :: Set a -> a\n\n This op requires that the non-emptyness of the relevant set is assured\n before being valid. In addition this assumes all values in the set are equal.\n ' + "* SetExtract :: Set a -> a\n\n This op requires that the non-emptyness of the relevant set is assured\n before being valid. In addition this assumes all values in the set are equal.\n " INTERSECTION: UnarySetExpr.Op.ValueType - '* Intersection :: Set (Range a) -> Range a\n\n May produce an empty range.\n Intersection({}) = [-inf, +inf]\n ' + "* Intersection :: Set (Range a) -> Range a\n\n May produce an empty range.\n Intersection({}) = [-inf, +inf]\n " HULL: UnarySetExpr.Op.ValueType - '* Hull :: Set (Range a) -> Range a\n Returns the convex hull (union with all the inner missing bits filled in)\n Hull({}) = EmptyRange\n ' + "* Hull :: Set (Range a) -> Range a\n Returns the convex hull (union with all the inner missing bits filled in)\n Hull({}) = EmptyRange\n " NEGATE: UnarySetExpr.Op.ValueType - '* Negate :: Numeric a => Set a -> Set a\n :: Numeric a => Set (Range a) -> Set (Range a)\n\n Pointwise negate\n ' + "* Negate :: Numeric a => Set a -> Set a\n :: Numeric a => Set (Range a) -> Set (Range a)\n\n Pointwise negate\n " INVERT: UnarySetExpr.Op.ValueType - '* Invert :: Set Float -> Set Float\n :: Set (Range Float) -> Set (Range Float)\n\n Pointwise Invert\n ' + "* Invert :: Set Float -> Set Float\n :: Set (Range Float) -> Set (Range Float)\n\n Pointwise Invert\n " FLATTEN: UnarySetExpr.Op.ValueType - 'Flatten[A] : Set[Set[A]] -> Set[A]\n Given an array of array of elements, flattens the inner array.\n Alternatively stated, concatenates all of the elements of the outer arrary\n ' + "Flatten[A] : Set[Set[A]] -> Set[A]\n Given an array of array of elements, flattens the inner array.\n Alternatively stated, concatenates all of the elements of the outer arrary\n " OP_FIELD_NUMBER: _builtins.int VALS_FIELD_NUMBER: _builtins.int op: Global___UnarySetExpr.Op.ValueType @_builtins.property - def vals(self) -> Global___ValueExpr: - ... + def vals(self) -> Global___ValueExpr: ... + def __init__( + self, *, op: Global___UnarySetExpr.Op.ValueType = ..., vals: Global___ValueExpr | None = ... + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["vals", b"vals"] - def __init__(self, *, op: Global___UnarySetExpr.Op.ValueType=..., vals: Global___ValueExpr | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['vals', b'vals'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["op", b"op", "vals", b"vals"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['op', b'op', 'vals', b'vals'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___UnarySetExpr: _TypeAlias = UnarySetExpr @_typing.final @@ -197,115 +191,114 @@ class BinaryExpr(_message.Message): DESCRIPTOR: _descriptor.Descriptor class _Op: - ValueType = _typing.NewType('ValueType', _builtins.int) + ValueType = _typing.NewType("ValueType", _builtins.int) V: _TypeAlias = ValueType class _OpEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[BinaryExpr._Op.ValueType], _builtins.type): DESCRIPTOR: _descriptor.EnumDescriptor UNDEFINED: BinaryExpr._Op.ValueType ADD: BinaryExpr._Op.ValueType - '* Add :: Numeric a => (lhs :: a, rhs :: a) -> a\n :: Numeric a => (lhs :: a, rhs :: Range a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: Range a) -> Range a\n ' + "* Add :: Numeric a => (lhs :: a, rhs :: a) -> a\n :: Numeric a => (lhs :: a, rhs :: Range a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: Range a) -> Range a\n " MULT: BinaryExpr._Op.ValueType - 'SUB = 11; // Use ADD and NEGATE instead\n\n * Mult :: Numeric a => (lhs :: a, rhs :: a) -> a\n :: Numeric a => (lhs :: a, rhs :: Range a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: Range a) -> Range a\n ' + "SUB = 11; // Use ADD and NEGATE instead\n\n * Mult :: Numeric a => (lhs :: a, rhs :: a) -> a\n :: Numeric a => (lhs :: a, rhs :: Range a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: Range a) -> Range a\n " SHRINK_MULT: BinaryExpr._Op.ValueType - 'A shrinking multiply operation for two Range types. Not commutative.\n See the documentation for shrink_multiply in the Python core HDL code for details.\n ' + "A shrinking multiply operation for two Range types. Not commutative.\n See the documentation for shrink_multiply in the Python core HDL code for details.\n " AND: BinaryExpr._Op.ValueType - 'DIV = 13; // Use MULT and INVERT instead\n\n * And :: (lhs :: Bool, rhs :: Bool) -> Bool\n ' + "DIV = 13; // Use MULT and INVERT instead\n\n * And :: (lhs :: Bool, rhs :: Bool) -> Bool\n " OR: BinaryExpr._Op.ValueType - '* Or :: (lhs :: Bool, rhs :: Bool) -> Bool' + "* Or :: (lhs :: Bool, rhs :: Bool) -> Bool" XOR: BinaryExpr._Op.ValueType - '* Xor :: (lhs :: Bool, rhs :: Bool) -> Bool' + "* Xor :: (lhs :: Bool, rhs :: Bool) -> Bool" IMPLIES: BinaryExpr._Op.ValueType - '* Implies :: (lhs :: Bool, rhs :: Bool) -> Bool' + "* Implies :: (lhs :: Bool, rhs :: Bool) -> Bool" EQ: BinaryExpr._Op.ValueType - 'IFF = 24; // Use EQ instead\n\n * Eq :: (Equality a) => (lhs :: a, rhs :: a) -> Bool\n ' + "IFF = 24; // Use EQ instead\n\n * Eq :: (Equality a) => (lhs :: a, rhs :: a) -> Bool\n " NEQ: BinaryExpr._Op.ValueType - '* Neq :: (Equality a) => (lhs :: a, rhs : a) -> Bool' + "* Neq :: (Equality a) => (lhs :: a, rhs : a) -> Bool" GT: BinaryExpr._Op.ValueType - '* GT :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool' + "* GT :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool" GTE: BinaryExpr._Op.ValueType - '* GTE :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool' + "* GTE :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool" LT: BinaryExpr._Op.ValueType - '* LT :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool' + "* LT :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool" LTE: BinaryExpr._Op.ValueType - '* LTE :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool' + "* LTE :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool" MAX: BinaryExpr._Op.ValueType - '* Max :: (Comparable a) => (lhs :: a, rhs :: a) -> a' + "* Max :: (Comparable a) => (lhs :: a, rhs :: a) -> a" MIN: BinaryExpr._Op.ValueType - '* Min :: (Comparable a) => (lhs :: a, rhs :: a) -> a' + "* Min :: (Comparable a) => (lhs :: a, rhs :: a) -> a" INTERSECTION: BinaryExpr._Op.ValueType - 'UNION = 50;\n\n * Intersection :: (Numeric a) => (lhs : Range a, rhs : Range a) -> Range a\n ' + "UNION = 50;\n\n * Intersection :: (Numeric a) => (lhs : Range a, rhs : Range a) -> Range a\n " HULL: BinaryExpr._Op.ValueType - '* Hull :: (lhs :: Range a, rhs :: Range a) -> Range a\n Given two input ranges, returns the convex hull (union with\n all the inner missing bits filled in)\n ' + "* Hull :: (lhs :: Range a, rhs :: Range a) -> Range a\n Given two input ranges, returns the convex hull (union with\n all the inner missing bits filled in)\n " WITHIN: BinaryExpr._Op.ValueType "INTERSECTS = 52;\n\n * Within :: (Numeric a) => (lhs :: Range a, rhs :: Range a) -> Bool\n :: (Numeric a) => (lhs :: a, rhs :: Range a) -> Bool\n\n Whether the lhs range or point is entirely within (contained by) the rhs.\n Used to be named SUBSET changed to a name that doesn't also imply a set op.\n " RANGE: BinaryExpr._Op.ValueType - '* Range :: (Comparable a) => (lower :: a, upper :: a) -> Range a' + "* Range :: (Comparable a) => (lower :: a, upper :: a) -> Range a" - class Op(_Op, metaclass=_OpEnumTypeWrapper): - ... + class Op(_Op, metaclass=_OpEnumTypeWrapper): ... UNDEFINED: BinaryExpr.Op.ValueType ADD: BinaryExpr.Op.ValueType - '* Add :: Numeric a => (lhs :: a, rhs :: a) -> a\n :: Numeric a => (lhs :: a, rhs :: Range a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: Range a) -> Range a\n ' + "* Add :: Numeric a => (lhs :: a, rhs :: a) -> a\n :: Numeric a => (lhs :: a, rhs :: Range a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: Range a) -> Range a\n " MULT: BinaryExpr.Op.ValueType - 'SUB = 11; // Use ADD and NEGATE instead\n\n * Mult :: Numeric a => (lhs :: a, rhs :: a) -> a\n :: Numeric a => (lhs :: a, rhs :: Range a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: Range a) -> Range a\n ' + "SUB = 11; // Use ADD and NEGATE instead\n\n * Mult :: Numeric a => (lhs :: a, rhs :: a) -> a\n :: Numeric a => (lhs :: a, rhs :: Range a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: a) -> Range a\n :: Numeric a => (lhs :: Range a, rhs :: Range a) -> Range a\n " SHRINK_MULT: BinaryExpr.Op.ValueType - 'A shrinking multiply operation for two Range types. Not commutative.\n See the documentation for shrink_multiply in the Python core HDL code for details.\n ' + "A shrinking multiply operation for two Range types. Not commutative.\n See the documentation for shrink_multiply in the Python core HDL code for details.\n " AND: BinaryExpr.Op.ValueType - 'DIV = 13; // Use MULT and INVERT instead\n\n * And :: (lhs :: Bool, rhs :: Bool) -> Bool\n ' + "DIV = 13; // Use MULT and INVERT instead\n\n * And :: (lhs :: Bool, rhs :: Bool) -> Bool\n " OR: BinaryExpr.Op.ValueType - '* Or :: (lhs :: Bool, rhs :: Bool) -> Bool' + "* Or :: (lhs :: Bool, rhs :: Bool) -> Bool" XOR: BinaryExpr.Op.ValueType - '* Xor :: (lhs :: Bool, rhs :: Bool) -> Bool' + "* Xor :: (lhs :: Bool, rhs :: Bool) -> Bool" IMPLIES: BinaryExpr.Op.ValueType - '* Implies :: (lhs :: Bool, rhs :: Bool) -> Bool' + "* Implies :: (lhs :: Bool, rhs :: Bool) -> Bool" EQ: BinaryExpr.Op.ValueType - 'IFF = 24; // Use EQ instead\n\n * Eq :: (Equality a) => (lhs :: a, rhs :: a) -> Bool\n ' + "IFF = 24; // Use EQ instead\n\n * Eq :: (Equality a) => (lhs :: a, rhs :: a) -> Bool\n " NEQ: BinaryExpr.Op.ValueType - '* Neq :: (Equality a) => (lhs :: a, rhs : a) -> Bool' + "* Neq :: (Equality a) => (lhs :: a, rhs : a) -> Bool" GT: BinaryExpr.Op.ValueType - '* GT :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool' + "* GT :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool" GTE: BinaryExpr.Op.ValueType - '* GTE :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool' + "* GTE :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool" LT: BinaryExpr.Op.ValueType - '* LT :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool' + "* LT :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool" LTE: BinaryExpr.Op.ValueType - '* LTE :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool' + "* LTE :: (Comparable a) => (lhs :: a, rhs :: a) -> Bool" MAX: BinaryExpr.Op.ValueType - '* Max :: (Comparable a) => (lhs :: a, rhs :: a) -> a' + "* Max :: (Comparable a) => (lhs :: a, rhs :: a) -> a" MIN: BinaryExpr.Op.ValueType - '* Min :: (Comparable a) => (lhs :: a, rhs :: a) -> a' + "* Min :: (Comparable a) => (lhs :: a, rhs :: a) -> a" INTERSECTION: BinaryExpr.Op.ValueType - 'UNION = 50;\n\n * Intersection :: (Numeric a) => (lhs : Range a, rhs : Range a) -> Range a\n ' + "UNION = 50;\n\n * Intersection :: (Numeric a) => (lhs : Range a, rhs : Range a) -> Range a\n " HULL: BinaryExpr.Op.ValueType - '* Hull :: (lhs :: Range a, rhs :: Range a) -> Range a\n Given two input ranges, returns the convex hull (union with\n all the inner missing bits filled in)\n ' + "* Hull :: (lhs :: Range a, rhs :: Range a) -> Range a\n Given two input ranges, returns the convex hull (union with\n all the inner missing bits filled in)\n " WITHIN: BinaryExpr.Op.ValueType "INTERSECTS = 52;\n\n * Within :: (Numeric a) => (lhs :: Range a, rhs :: Range a) -> Bool\n :: (Numeric a) => (lhs :: a, rhs :: Range a) -> Bool\n\n Whether the lhs range or point is entirely within (contained by) the rhs.\n Used to be named SUBSET changed to a name that doesn't also imply a set op.\n " RANGE: BinaryExpr.Op.ValueType - '* Range :: (Comparable a) => (lower :: a, upper :: a) -> Range a' + "* Range :: (Comparable a) => (lower :: a, upper :: a) -> Range a" OP_FIELD_NUMBER: _builtins.int LHS_FIELD_NUMBER: _builtins.int RHS_FIELD_NUMBER: _builtins.int op: Global___BinaryExpr.Op.ValueType @_builtins.property - def lhs(self) -> Global___ValueExpr: - ... - + def lhs(self) -> Global___ValueExpr: ... @_builtins.property - def rhs(self) -> Global___ValueExpr: - ... + def rhs(self) -> Global___ValueExpr: ... + def __init__( + self, + *, + op: Global___BinaryExpr.Op.ValueType = ..., + lhs: Global___ValueExpr | None = ..., + rhs: Global___ValueExpr | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["lhs", b"lhs", "rhs", b"rhs"] - def __init__(self, *, op: Global___BinaryExpr.Op.ValueType=..., lhs: Global___ValueExpr | None=..., rhs: Global___ValueExpr | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['lhs', b'lhs', 'rhs', b'rhs'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["lhs", b"lhs", "op", b"op", "rhs", b"rhs"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['lhs', b'lhs', 'op', b'op', 'rhs', b'rhs'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___BinaryExpr: _TypeAlias = BinaryExpr @_typing.final @@ -313,73 +306,70 @@ class BinarySetExpr(_message.Message): DESCRIPTOR: _descriptor.Descriptor class _Op: - ValueType = _typing.NewType('ValueType', _builtins.int) + ValueType = _typing.NewType("ValueType", _builtins.int) V: _TypeAlias = ValueType class _OpEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[BinarySetExpr._Op.ValueType], _builtins.type): DESCRIPTOR: _descriptor.EnumDescriptor UNDEFINED: BinarySetExpr._Op.ValueType ADD: BinarySetExpr._Op.ValueType - '* Add :: Numeric a => (lhset : Set a, rhs : a) -> Set a\n :: Numeric a => (lhset : Set a, rhs : Range a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : Range a) -> Set (Range a)\n ' + "* Add :: Numeric a => (lhset : Set a, rhs : a) -> Set a\n :: Numeric a => (lhset : Set a, rhs : Range a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : Range a) -> Set (Range a)\n " MULT: BinarySetExpr._Op.ValueType - '* Mult :: Numeric a => (lhset : Set a, rhs : a) -> Set a\n :: Numeric a => (lhset : Set a, rhs : Range a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : Range a) -> Set (Range a)\n ' + "* Mult :: Numeric a => (lhset : Set a, rhs : a) -> Set a\n :: Numeric a => (lhset : Set a, rhs : Range a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : Range a) -> Set (Range a)\n " CONCAT: BinarySetExpr._Op.ValueType - 'String concatenate operator\n Concatenate : (lhs: String, rhss: Set[String]) -> Set[String] (prepend lhs to all elements)\n : (lhss: Set[String], rhs: String) -> Set[String] (append rhs to all elements)\n ' + "String concatenate operator\n Concatenate : (lhs: String, rhss: Set[String]) -> Set[String] (prepend lhs to all elements)\n : (lhss: Set[String], rhs: String) -> Set[String] (append rhs to all elements)\n " EQ: BinarySetExpr._Op.ValueType - 'Equality operator\n (lhss: Set[A], elt: A) -> Set[Bool] (pointwise equality of all elements in the set to the element)\n ' + "Equality operator\n (lhss: Set[A], elt: A) -> Set[Bool] (pointwise equality of all elements in the set to the element)\n " - class Op(_Op, metaclass=_OpEnumTypeWrapper): - ... + class Op(_Op, metaclass=_OpEnumTypeWrapper): ... UNDEFINED: BinarySetExpr.Op.ValueType ADD: BinarySetExpr.Op.ValueType - '* Add :: Numeric a => (lhset : Set a, rhs : a) -> Set a\n :: Numeric a => (lhset : Set a, rhs : Range a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : Range a) -> Set (Range a)\n ' + "* Add :: Numeric a => (lhset : Set a, rhs : a) -> Set a\n :: Numeric a => (lhset : Set a, rhs : Range a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : Range a) -> Set (Range a)\n " MULT: BinarySetExpr.Op.ValueType - '* Mult :: Numeric a => (lhset : Set a, rhs : a) -> Set a\n :: Numeric a => (lhset : Set a, rhs : Range a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : Range a) -> Set (Range a)\n ' + "* Mult :: Numeric a => (lhset : Set a, rhs : a) -> Set a\n :: Numeric a => (lhset : Set a, rhs : Range a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : a) -> Set (Range a)\n :: Numeric a => (lhset : Set (Range a), rhs : Range a) -> Set (Range a)\n " CONCAT: BinarySetExpr.Op.ValueType - 'String concatenate operator\n Concatenate : (lhs: String, rhss: Set[String]) -> Set[String] (prepend lhs to all elements)\n : (lhss: Set[String], rhs: String) -> Set[String] (append rhs to all elements)\n ' + "String concatenate operator\n Concatenate : (lhs: String, rhss: Set[String]) -> Set[String] (prepend lhs to all elements)\n : (lhss: Set[String], rhs: String) -> Set[String] (append rhs to all elements)\n " EQ: BinarySetExpr.Op.ValueType - 'Equality operator\n (lhss: Set[A], elt: A) -> Set[Bool] (pointwise equality of all elements in the set to the element)\n ' + "Equality operator\n (lhss: Set[A], elt: A) -> Set[Bool] (pointwise equality of all elements in the set to the element)\n " OP_FIELD_NUMBER: _builtins.int LHSET_FIELD_NUMBER: _builtins.int RHS_FIELD_NUMBER: _builtins.int op: Global___BinarySetExpr.Op.ValueType @_builtins.property - def lhset(self) -> Global___ValueExpr: - ... - + def lhset(self) -> Global___ValueExpr: ... @_builtins.property - def rhs(self) -> Global___ValueExpr: - ... + def rhs(self) -> Global___ValueExpr: ... + def __init__( + self, + *, + op: Global___BinarySetExpr.Op.ValueType = ..., + lhset: Global___ValueExpr | None = ..., + rhs: Global___ValueExpr | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["lhset", b"lhset", "rhs", b"rhs"] - def __init__(self, *, op: Global___BinarySetExpr.Op.ValueType=..., lhset: Global___ValueExpr | None=..., rhs: Global___ValueExpr | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['lhset', b'lhset', 'rhs', b'rhs'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["lhset", b"lhset", "op", b"op", "rhs", b"rhs"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['lhset', b'lhset', 'op', b'op', 'rhs', b'rhs'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___BinarySetExpr: _TypeAlias = BinarySetExpr @_typing.final class ArrayExpr(_message.Message): """* Creates an array from element exprs""" + DESCRIPTOR: _descriptor.Descriptor VALS_FIELD_NUMBER: _builtins.int @_builtins.property - def vals(self) -> _containers.RepeatedCompositeFieldContainer[Global___ValueExpr]: - ... + def vals(self) -> _containers.RepeatedCompositeFieldContainer[Global___ValueExpr]: ... + def __init__(self, *, vals: _abc.Iterable[Global___ValueExpr] | None = ...) -> None: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["vals", b"vals"] - def __init__(self, *, vals: _abc.Iterable[Global___ValueExpr] | None=...) -> None: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['vals', b'vals'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___ArrayExpr: _TypeAlias = ArrayExpr @_typing.final @@ -387,28 +377,25 @@ class RangeExpr(_message.Message): """* Ranges have an expression form, allowing you to constrain them without specifying them fully """ + DESCRIPTOR: _descriptor.Descriptor MINIMUM_FIELD_NUMBER: _builtins.int MAXIMUM_FIELD_NUMBER: _builtins.int @_builtins.property - def minimum(self) -> Global___ValueExpr: - ... - + def minimum(self) -> Global___ValueExpr: ... @_builtins.property - def maximum(self) -> Global___ValueExpr: - ... + def maximum(self) -> Global___ValueExpr: ... + def __init__( + self, *, minimum: Global___ValueExpr | None = ..., maximum: Global___ValueExpr | None = ... + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["maximum", b"maximum", "minimum", b"minimum"] - def __init__(self, *, minimum: Global___ValueExpr | None=..., maximum: Global___ValueExpr | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['maximum', b'maximum', 'minimum', b'minimum'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["maximum", b"maximum", "minimum", b"minimum"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['maximum', b'maximum', 'minimum', b'minimum'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___RangeExpr: _TypeAlias = RangeExpr @_typing.final @@ -416,6 +403,7 @@ class StructExpr(_message.Message): """* Structs have an expression form, allowing you to constrain them without specifying them fully """ + DESCRIPTOR: _descriptor.Descriptor @_typing.final @@ -426,36 +414,30 @@ class StructExpr(_message.Message): key: _builtins.str @_builtins.property - def value(self) -> Global___ValueExpr: - ... + def value(self) -> Global___ValueExpr: ... + def __init__(self, *, key: _builtins.str = ..., value: Global___ValueExpr | None = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["value", b"value"] - def __init__(self, *, key: _builtins.str=..., value: Global___ValueExpr | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['value', b'value'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["key", b"key", "value", b"value"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['key', b'key', 'value', b'value'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... VALS_FIELD_NUMBER: _builtins.int @_builtins.property - def vals(self) -> _containers.MessageMap[_builtins.str, Global___ValueExpr]: - ... + def vals(self) -> _containers.MessageMap[_builtins.str, Global___ValueExpr]: ... + def __init__(self, *, vals: _abc.Mapping[_builtins.str, Global___ValueExpr] | None = ...) -> None: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["vals", b"vals"] - def __init__(self, *, vals: _abc.Mapping[_builtins.str, Global___ValueExpr] | None=...) -> None: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['vals', b'vals'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___StructExpr: _TypeAlias = StructExpr @_typing.final class IfThenElseExpr(_message.Message): """* IfThenElse :: (cond :: Bool, tru :: a, fal :: a) -> a""" + DESCRIPTOR: _descriptor.Descriptor COND_FIELD_NUMBER: _builtins.int TRU_FIELD_NUMBER: _builtins.int @@ -463,31 +445,28 @@ class IfThenElseExpr(_message.Message): META_FIELD_NUMBER: _builtins.int @_builtins.property - def cond(self) -> Global___ValueExpr: - ... - + def cond(self) -> Global___ValueExpr: ... @_builtins.property - def tru(self) -> Global___ValueExpr: - ... - + def tru(self) -> Global___ValueExpr: ... @_builtins.property - def fal(self) -> Global___ValueExpr: - ... - + def fal(self) -> Global___ValueExpr: ... @_builtins.property - def meta(self) -> _common_pb2.Metadata: - ... + def meta(self) -> _common_pb2.Metadata: ... + def __init__( + self, + *, + cond: Global___ValueExpr | None = ..., + tru: Global___ValueExpr | None = ..., + fal: Global___ValueExpr | None = ..., + meta: _common_pb2.Metadata | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["cond", b"cond", "fal", b"fal", "meta", b"meta", "tru", b"tru"] - def __init__(self, *, cond: Global___ValueExpr | None=..., tru: Global___ValueExpr | None=..., fal: Global___ValueExpr | None=..., meta: _common_pb2.Metadata | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['cond', b'cond', 'fal', b'fal', 'meta', b'meta', 'tru', b'tru'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["cond", b"cond", "fal", b"fal", "meta", b"meta", "tru", b"tru"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['cond', b'cond', 'fal', b'fal', 'meta', b'meta', 'tru', b'tru'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___IfThenElseExpr: _TypeAlias = IfThenElseExpr @_typing.final @@ -496,60 +475,54 @@ class ExtractExpr(_message.Message): Extract :: (container :: Struct{index :: a}, index :: string) -> a Extract :: (container :: Range a , index :: {"minimum"|"maximum"}) -> a """ + DESCRIPTOR: _descriptor.Descriptor CONTAINER_FIELD_NUMBER: _builtins.int INDEX_FIELD_NUMBER: _builtins.int @_builtins.property - def container(self) -> Global___ValueExpr: - ... - + def container(self) -> Global___ValueExpr: ... @_builtins.property - def index(self) -> Global___ValueExpr: - ... + def index(self) -> Global___ValueExpr: ... + def __init__( + self, *, container: Global___ValueExpr | None = ..., index: Global___ValueExpr | None = ... + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["container", b"container", "index", b"index"] - def __init__(self, *, container: Global___ValueExpr | None=..., index: Global___ValueExpr | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['container', b'container', 'index', b'index'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["container", b"container", "index", b"index"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['container', b'container', 'index', b'index'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___ExtractExpr: _TypeAlias = ExtractExpr @_typing.final class MapExtractExpr(_message.Message): """/** MapExtract :: (container :: Array a , path :: LocalRef{from :: a, to :: b}) -> Array b - MapExtract :: (container :: Set a , path :: LocalRef{from :: a, to :: b}) -> Set b + MapExtract :: (container :: Set a , path :: LocalRef{from :: a, to :: b}) -> Set b - This expression can map over a container and return a container of - the relevant subexpression determined by a path. */ + This expression can map over a container and return a container of + the relevant subexpression determined by a path. */ """ + DESCRIPTOR: _descriptor.Descriptor CONTAINER_FIELD_NUMBER: _builtins.int PATH_FIELD_NUMBER: _builtins.int @_builtins.property - def container(self) -> Global___ValueExpr: - ... - + def container(self) -> Global___ValueExpr: ... @_builtins.property - def path(self) -> _ref_pb2.LocalPath: - ... + def path(self) -> _ref_pb2.LocalPath: ... + def __init__( + self, *, container: Global___ValueExpr | None = ..., path: _ref_pb2.LocalPath | None = ... + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["container", b"container", "path", b"path"] - def __init__(self, *, container: Global___ValueExpr | None=..., path: _ref_pb2.LocalPath | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['container', b'container', 'path', b'path'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["container", b"container", "path", b"path"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['container', b'container', 'path', b'path'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___MapExtractExpr: _TypeAlias = MapExtractExpr @_typing.final @@ -558,19 +531,16 @@ class ConnectedExpr(_message.Message): This tells us whether the specified ports are connected """ + DESCRIPTOR: _descriptor.Descriptor BLOCK_PORT_FIELD_NUMBER: _builtins.int LINK_PORT_FIELD_NUMBER: _builtins.int EXPANDED_FIELD_NUMBER: _builtins.int @_builtins.property - def block_port(self) -> Global___ValueExpr: - ... - + def block_port(self) -> Global___ValueExpr: ... @_builtins.property - def link_port(self) -> Global___ValueExpr: - ... - + def link_port(self) -> Global___ValueExpr: ... @_builtins.property def expanded(self) -> _containers.RepeatedCompositeFieldContainer[Global___ConnectedExpr]: """During compilation, ConnectedExpr may be expanded (allocate replaced with concrete path indices, @@ -579,16 +549,22 @@ class ConnectedExpr(_message.Message): while the original (parent) is not modified. """ - def __init__(self, *, block_port: Global___ValueExpr | None=..., link_port: Global___ValueExpr | None=..., expanded: _abc.Iterable[Global___ConnectedExpr] | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['block_port', b'block_port', 'link_port', b'link_port'] + def __init__( + self, + *, + block_port: Global___ValueExpr | None = ..., + link_port: Global___ValueExpr | None = ..., + expanded: _abc.Iterable[Global___ConnectedExpr] | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["block_port", b"block_port", "link_port", b"link_port"] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "block_port", b"block_port", "expanded", b"expanded", "link_port", b"link_port" + ] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['block_port', b'block_port', 'expanded', b'expanded', 'link_port', b'link_port'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___ConnectedExpr: _TypeAlias = ConnectedExpr @_typing.final @@ -597,33 +573,38 @@ class ExportedExpr(_message.Message): This tells us whether the specified port is exported to the hierarchy block exterior port """ + DESCRIPTOR: _descriptor.Descriptor EXTERIOR_PORT_FIELD_NUMBER: _builtins.int INTERNAL_BLOCK_PORT_FIELD_NUMBER: _builtins.int EXPANDED_FIELD_NUMBER: _builtins.int @_builtins.property - def exterior_port(self) -> Global___ValueExpr: - ... - + def exterior_port(self) -> Global___ValueExpr: ... @_builtins.property - def internal_block_port(self) -> Global___ValueExpr: - ... - + def internal_block_port(self) -> Global___ValueExpr: ... @_builtins.property def expanded(self) -> _containers.RepeatedCompositeFieldContainer[Global___ExportedExpr]: """see comment in ConnectedExpr""" - def __init__(self, *, exterior_port: Global___ValueExpr | None=..., internal_block_port: Global___ValueExpr | None=..., expanded: _abc.Iterable[Global___ExportedExpr] | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['exterior_port', b'exterior_port', 'internal_block_port', b'internal_block_port'] + def __init__( + self, + *, + exterior_port: Global___ValueExpr | None = ..., + internal_block_port: Global___ValueExpr | None = ..., + expanded: _abc.Iterable[Global___ExportedExpr] | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal[ + "exterior_port", b"exterior_port", "internal_block_port", b"internal_block_port" + ] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "expanded", b"expanded", "exterior_port", b"exterior_port", "internal_block_port", b"internal_block_port" + ] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['expanded', b'expanded', 'exterior_port', b'exterior_port', 'internal_block_port', b'internal_block_port'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___ExportedExpr: _TypeAlias = ExportedExpr @_typing.final @@ -631,28 +612,23 @@ class AssignExpr(_message.Message): """Variable assignment (from an expression value), which allows dataflow to be directioned and explicit. Assignments should not be cyclic. """ + DESCRIPTOR: _descriptor.Descriptor DST_FIELD_NUMBER: _builtins.int SRC_FIELD_NUMBER: _builtins.int @_builtins.property - def dst(self) -> _ref_pb2.LocalPath: - ... - + def dst(self) -> _ref_pb2.LocalPath: ... @_builtins.property - def src(self) -> Global___ValueExpr: - ... + def src(self) -> Global___ValueExpr: ... + def __init__(self, *, dst: _ref_pb2.LocalPath | None = ..., src: Global___ValueExpr | None = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["dst", b"dst", "src", b"src"] - def __init__(self, *, dst: _ref_pb2.LocalPath | None=..., src: Global___ValueExpr | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['dst', b'dst', 'src', b'src'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["dst", b"dst", "src", b"src"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['dst', b'dst', 'src', b'src'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___AssignExpr: _TypeAlias = AssignExpr @_typing.final @@ -680,49 +656,29 @@ class ValueExpr(_message.Message): META_FIELD_NUMBER: _builtins.int @_builtins.property - def literal(self) -> _lit_pb2.ValueLit: - ... - + def literal(self) -> _lit_pb2.ValueLit: ... @_builtins.property - def binary(self) -> Global___BinaryExpr: - ... - + def binary(self) -> Global___BinaryExpr: ... @_builtins.property - def binary_set(self) -> Global___BinarySetExpr: - ... - + def binary_set(self) -> Global___BinarySetExpr: ... @_builtins.property - def unary(self) -> Global___UnaryExpr: - ... - + def unary(self) -> Global___UnaryExpr: ... @_builtins.property - def unary_set(self) -> Global___UnarySetExpr: - ... - + def unary_set(self) -> Global___UnarySetExpr: ... @_builtins.property def array(self) -> Global___ArrayExpr: """SetExpr set = 5;""" @_builtins.property - def struct(self) -> Global___StructExpr: - ... - + def struct(self) -> Global___StructExpr: ... @_builtins.property - def range(self) -> Global___RangeExpr: - ... - + def range(self) -> Global___RangeExpr: ... @_builtins.property - def ifThenElse(self) -> Global___IfThenElseExpr: - ... - + def ifThenElse(self) -> Global___IfThenElseExpr: ... @_builtins.property - def extract(self) -> Global___ExtractExpr: - ... - + def extract(self) -> Global___ExtractExpr: ... @_builtins.property - def map_extract(self) -> Global___MapExtractExpr: - ... - + def map_extract(self) -> Global___MapExtractExpr: ... @_builtins.property def connected(self) -> Global___ConnectedExpr: """single port to single port connect""" @@ -740,9 +696,7 @@ class ValueExpr(_message.Message): """array to array export, where allocate means allocate a subarray""" @_builtins.property - def assign(self) -> Global___AssignExpr: - ... - + def assign(self) -> Global___AssignExpr: ... @_builtins.property def exportedTunnel(self) -> Global___ExportedExpr: """These Exprs support cross-hierarchy operations @@ -764,26 +718,148 @@ class ValueExpr(_message.Message): """ @_builtins.property - def ref(self) -> _ref_pb2.LocalPath: - ... - - @_builtins.property - def meta(self) -> _common_pb2.Metadata: - ... - - def __init__(self, *, literal: _lit_pb2.ValueLit | None=..., binary: Global___BinaryExpr | None=..., binary_set: Global___BinarySetExpr | None=..., unary: Global___UnaryExpr | None=..., unary_set: Global___UnarySetExpr | None=..., array: Global___ArrayExpr | None=..., struct: Global___StructExpr | None=..., range: Global___RangeExpr | None=..., ifThenElse: Global___IfThenElseExpr | None=..., extract: Global___ExtractExpr | None=..., map_extract: Global___MapExtractExpr | None=..., connected: Global___ConnectedExpr | None=..., exported: Global___ExportedExpr | None=..., connectedArray: Global___ConnectedExpr | None=..., exportedArray: Global___ExportedExpr | None=..., assign: Global___AssignExpr | None=..., exportedTunnel: Global___ExportedExpr | None=..., assignTunnel: Global___AssignExpr | None=..., ref: _ref_pb2.LocalPath | None=..., meta: _common_pb2.Metadata | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['array', b'array', 'assign', b'assign', 'assignTunnel', b'assignTunnel', 'binary', b'binary', 'binary_set', b'binary_set', 'connected', b'connected', 'connectedArray', b'connectedArray', 'exported', b'exported', 'exportedArray', b'exportedArray', 'exportedTunnel', b'exportedTunnel', 'expr', b'expr', 'extract', b'extract', 'ifThenElse', b'ifThenElse', 'literal', b'literal', 'map_extract', b'map_extract', 'meta', b'meta', 'range', b'range', 'ref', b'ref', 'struct', b'struct', 'unary', b'unary', 'unary_set', b'unary_set'] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['array', b'array', 'assign', b'assign', 'assignTunnel', b'assignTunnel', 'binary', b'binary', 'binary_set', b'binary_set', 'connected', b'connected', 'connectedArray', b'connectedArray', 'exported', b'exported', 'exportedArray', b'exportedArray', 'exportedTunnel', b'exportedTunnel', 'expr', b'expr', 'extract', b'extract', 'ifThenElse', b'ifThenElse', 'literal', b'literal', 'map_extract', b'map_extract', 'meta', b'meta', 'range', b'range', 'ref', b'ref', 'struct', b'struct', 'unary', b'unary', 'unary_set', b'unary_set'] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... - _WhichOneofReturnType_expr: _TypeAlias = _typing.Literal['literal', 'binary', 'binary_set', 'unary', 'unary_set', 'array', 'struct', 'range', 'ifThenElse', 'extract', 'map_extract', 'connected', 'exported', 'connectedArray', 'exportedArray', 'assign', 'exportedTunnel', 'assignTunnel', 'ref'] - _WhichOneofArgType_expr: _TypeAlias = _typing.Literal['expr', b'expr'] - - def WhichOneof(self, oneof_group: _WhichOneofArgType_expr) -> _WhichOneofReturnType_expr | None: - ... -Global___ValueExpr: _TypeAlias = ValueExpr \ No newline at end of file + def ref(self) -> _ref_pb2.LocalPath: ... + @_builtins.property + def meta(self) -> _common_pb2.Metadata: ... + def __init__( + self, + *, + literal: _lit_pb2.ValueLit | None = ..., + binary: Global___BinaryExpr | None = ..., + binary_set: Global___BinarySetExpr | None = ..., + unary: Global___UnaryExpr | None = ..., + unary_set: Global___UnarySetExpr | None = ..., + array: Global___ArrayExpr | None = ..., + struct: Global___StructExpr | None = ..., + range: Global___RangeExpr | None = ..., + ifThenElse: Global___IfThenElseExpr | None = ..., + extract: Global___ExtractExpr | None = ..., + map_extract: Global___MapExtractExpr | None = ..., + connected: Global___ConnectedExpr | None = ..., + exported: Global___ExportedExpr | None = ..., + connectedArray: Global___ConnectedExpr | None = ..., + exportedArray: Global___ExportedExpr | None = ..., + assign: Global___AssignExpr | None = ..., + exportedTunnel: Global___ExportedExpr | None = ..., + assignTunnel: Global___AssignExpr | None = ..., + ref: _ref_pb2.LocalPath | None = ..., + meta: _common_pb2.Metadata | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal[ + "array", + b"array", + "assign", + b"assign", + "assignTunnel", + b"assignTunnel", + "binary", + b"binary", + "binary_set", + b"binary_set", + "connected", + b"connected", + "connectedArray", + b"connectedArray", + "exported", + b"exported", + "exportedArray", + b"exportedArray", + "exportedTunnel", + b"exportedTunnel", + "expr", + b"expr", + "extract", + b"extract", + "ifThenElse", + b"ifThenElse", + "literal", + b"literal", + "map_extract", + b"map_extract", + "meta", + b"meta", + "range", + b"range", + "ref", + b"ref", + "struct", + b"struct", + "unary", + b"unary", + "unary_set", + b"unary_set", + ] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "array", + b"array", + "assign", + b"assign", + "assignTunnel", + b"assignTunnel", + "binary", + b"binary", + "binary_set", + b"binary_set", + "connected", + b"connected", + "connectedArray", + b"connectedArray", + "exported", + b"exported", + "exportedArray", + b"exportedArray", + "exportedTunnel", + b"exportedTunnel", + "expr", + b"expr", + "extract", + b"extract", + "ifThenElse", + b"ifThenElse", + "literal", + b"literal", + "map_extract", + b"map_extract", + "meta", + b"meta", + "range", + b"range", + "ref", + b"ref", + "struct", + b"struct", + "unary", + b"unary", + "unary_set", + b"unary_set", + ] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_expr: _TypeAlias = _typing.Literal[ + "literal", + "binary", + "binary_set", + "unary", + "unary_set", + "array", + "struct", + "range", + "ifThenElse", + "extract", + "map_extract", + "connected", + "exported", + "connectedArray", + "exportedArray", + "assign", + "exportedTunnel", + "assignTunnel", + "ref", + ] + _WhichOneofArgType_expr: _TypeAlias = _typing.Literal["expr", b"expr"] + + def WhichOneof(self, oneof_group: _WhichOneofArgType_expr) -> _WhichOneofReturnType_expr | None: ... + +Global___ValueExpr: _TypeAlias = ValueExpr diff --git a/edg/edgir/impl_pb2.py b/edg/edgir/impl_pb2.py index 47e51e529..2392b5cbe 100644 --- a/edg/edgir/impl_pb2.py +++ b/edg/edgir/impl_pb2.py @@ -1,13 +1,18 @@ """Generated protocol buffer code.""" + from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database + _sym_db = _symbol_database.Default() from ..edgir import common_pb2 as edgir_dot_common__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10edgir/impl.proto\x12\nedgir.impl\x1a\x12edgir/common.proto"1\n\tBlockImpl\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata"0\n\x08PortImpl\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata"0\n\x08LinkImpl\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata"7\n\x0fEnvironmentImpl\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadatab\x06proto3') + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n\x10edgir/impl.proto\x12\nedgir.impl\x1a\x12edgir/common.proto"1\n\tBlockImpl\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata"0\n\x08PortImpl\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata"0\n\x08LinkImpl\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata"7\n\x0fEnvironmentImpl\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadatab\x06proto3' +) _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'edgir.impl_pb2', globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "edgir.impl_pb2", globals()) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None _BLOCKIMPL._serialized_start = 52 @@ -17,4 +22,4 @@ _LINKIMPL._serialized_start = 153 _LINKIMPL._serialized_end = 201 _ENVIRONMENTIMPL._serialized_start = 203 - _ENVIRONMENTIMPL._serialized_end = 258 \ No newline at end of file + _ENVIRONMENTIMPL._serialized_end = 258 diff --git a/edg/edgir/impl_pb2.pyi b/edg/edgir/impl_pb2.pyi index a38a4ffdd..3169fd28a 100644 --- a/edg/edgir/impl_pb2.pyi +++ b/edg/edgir/impl_pb2.pyi @@ -10,12 +10,14 @@ stored. Fuck if I know what that will look like, so for now you just get a metadata block. """ + from edgir import common_pb2 as _common_pb2 from google.protobuf import descriptor as _descriptor from google.protobuf import message as _message import builtins as _builtins import sys import typing as _typing + if sys.version_info >= (3, 10): from typing import TypeAlias as _TypeAlias else: @@ -28,19 +30,15 @@ class BlockImpl(_message.Message): META_FIELD_NUMBER: _builtins.int @_builtins.property - def meta(self) -> _common_pb2.Metadata: - ... + def meta(self) -> _common_pb2.Metadata: ... + def __init__(self, *, meta: _common_pb2.Metadata | None = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta"] - def __init__(self, *, meta: _common_pb2.Metadata | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___BlockImpl: _TypeAlias = BlockImpl @_typing.final @@ -49,19 +47,15 @@ class PortImpl(_message.Message): META_FIELD_NUMBER: _builtins.int @_builtins.property - def meta(self) -> _common_pb2.Metadata: - ... + def meta(self) -> _common_pb2.Metadata: ... + def __init__(self, *, meta: _common_pb2.Metadata | None = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta"] - def __init__(self, *, meta: _common_pb2.Metadata | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___PortImpl: _TypeAlias = PortImpl @_typing.final @@ -70,19 +64,15 @@ class LinkImpl(_message.Message): META_FIELD_NUMBER: _builtins.int @_builtins.property - def meta(self) -> _common_pb2.Metadata: - ... + def meta(self) -> _common_pb2.Metadata: ... + def __init__(self, *, meta: _common_pb2.Metadata | None = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta"] - def __init__(self, *, meta: _common_pb2.Metadata | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___LinkImpl: _TypeAlias = LinkImpl @_typing.final @@ -91,17 +81,13 @@ class EnvironmentImpl(_message.Message): META_FIELD_NUMBER: _builtins.int @_builtins.property - def meta(self) -> _common_pb2.Metadata: - ... + def meta(self) -> _common_pb2.Metadata: ... + def __init__(self, *, meta: _common_pb2.Metadata | None = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta"] - def __init__(self, *, meta: _common_pb2.Metadata | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... -Global___EnvironmentImpl: _TypeAlias = EnvironmentImpl \ No newline at end of file +Global___EnvironmentImpl: _TypeAlias = EnvironmentImpl diff --git a/edg/edgir/init_pb2.py b/edg/edgir/init_pb2.py index 92571bac8..6b6964627 100644 --- a/edg/edgir/init_pb2.py +++ b/edg/edgir/init_pb2.py @@ -1,14 +1,19 @@ """Generated protocol buffer code.""" + from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database + _sym_db = _symbol_database.Default() from ..edgir import common_pb2 as edgir_dot_common__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10edgir/init.proto\x12\nedgir.init\x1a\x12edgir/common.proto"\xeb\x02\n\x07ValInit\x12\'\n\x08floating\x18\x01 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12&\n\x07integer\x18\x02 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12&\n\x07boolean\x18\x03 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12#\n\x04text\x18\x04 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12"\n\x03set\x18\x08 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12%\n\x06struct\x18\t \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12$\n\x05range\x18\n \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12$\n\x05array\x18\x0b \x01(\x0b2\x13.edgir.init.ValInitH\x00\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.MetadataB\x05\n\x03valb\x06proto3') + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n\x10edgir/init.proto\x12\nedgir.init\x1a\x12edgir/common.proto"\xeb\x02\n\x07ValInit\x12\'\n\x08floating\x18\x01 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12&\n\x07integer\x18\x02 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12&\n\x07boolean\x18\x03 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12#\n\x04text\x18\x04 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12"\n\x03set\x18\x08 \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12%\n\x06struct\x18\t \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12$\n\x05range\x18\n \x01(\x0b2\x13.edgir.common.EmptyH\x00\x12$\n\x05array\x18\x0b \x01(\x0b2\x13.edgir.init.ValInitH\x00\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.MetadataB\x05\n\x03valb\x06proto3' +) _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'edgir.init_pb2', globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "edgir.init_pb2", globals()) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None _VALINIT._serialized_start = 53 - _VALINIT._serialized_end = 416 \ No newline at end of file + _VALINIT._serialized_end = 416 diff --git a/edg/edgir/init_pb2.pyi b/edg/edgir/init_pb2.pyi index 534446937..dce1504c7 100644 --- a/edg/edgir/init_pb2.pyi +++ b/edg/edgir/init_pb2.pyi @@ -11,12 +11,14 @@ creating a value. FIXME :: Does this make more sense in another file? """ + from edgir import common_pb2 as _common_pb2 from google.protobuf import descriptor as _descriptor from google.protobuf import message as _message import builtins as _builtins import sys import typing as _typing + if sys.version_info >= (3, 10): from typing import TypeAlias as _TypeAlias else: @@ -30,6 +32,7 @@ class ValInit(_message.Message): I think the frontend should have more type specific wrappers around this since the data required for each type can be different. """ + DESCRIPTOR: _descriptor.Descriptor FLOATING_FIELD_NUMBER: _builtins.int INTEGER_FIELD_NUMBER: _builtins.int @@ -42,54 +45,89 @@ class ValInit(_message.Message): META_FIELD_NUMBER: _builtins.int @_builtins.property - def floating(self) -> _common_pb2.Empty: - ... - + def floating(self) -> _common_pb2.Empty: ... @_builtins.property - def integer(self) -> _common_pb2.Empty: - ... - + def integer(self) -> _common_pb2.Empty: ... @_builtins.property - def boolean(self) -> _common_pb2.Empty: - ... - + def boolean(self) -> _common_pb2.Empty: ... @_builtins.property - def text(self) -> _common_pb2.Empty: - ... - + def text(self) -> _common_pb2.Empty: ... @_builtins.property - def set(self) -> _common_pb2.Empty: - ... - + def set(self) -> _common_pb2.Empty: ... @_builtins.property - def struct(self) -> _common_pb2.Empty: - ... - + def struct(self) -> _common_pb2.Empty: ... @_builtins.property - def range(self) -> _common_pb2.Empty: - ... - + def range(self) -> _common_pb2.Empty: ... @_builtins.property - def array(self) -> Global___ValInit: - ... - + def array(self) -> Global___ValInit: ... @_builtins.property - def meta(self) -> _common_pb2.Metadata: - ... - - def __init__(self, *, floating: _common_pb2.Empty | None=..., integer: _common_pb2.Empty | None=..., boolean: _common_pb2.Empty | None=..., text: _common_pb2.Empty | None=..., set: _common_pb2.Empty | None=..., struct: _common_pb2.Empty | None=..., range: _common_pb2.Empty | None=..., array: Global___ValInit | None=..., meta: _common_pb2.Metadata | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['array', b'array', 'boolean', b'boolean', 'floating', b'floating', 'integer', b'integer', 'meta', b'meta', 'range', b'range', 'set', b'set', 'struct', b'struct', 'text', b'text', 'val', b'val'] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['array', b'array', 'boolean', b'boolean', 'floating', b'floating', 'integer', b'integer', 'meta', b'meta', 'range', b'range', 'set', b'set', 'struct', b'struct', 'text', b'text', 'val', b'val'] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... - _WhichOneofReturnType_val: _TypeAlias = _typing.Literal['floating', 'integer', 'boolean', 'text', 'set', 'struct', 'range', 'array'] - _WhichOneofArgType_val: _TypeAlias = _typing.Literal['val', b'val'] - - def WhichOneof(self, oneof_group: _WhichOneofArgType_val) -> _WhichOneofReturnType_val | None: - ... -Global___ValInit: _TypeAlias = ValInit \ No newline at end of file + def meta(self) -> _common_pb2.Metadata: ... + def __init__( + self, + *, + floating: _common_pb2.Empty | None = ..., + integer: _common_pb2.Empty | None = ..., + boolean: _common_pb2.Empty | None = ..., + text: _common_pb2.Empty | None = ..., + set: _common_pb2.Empty | None = ..., + struct: _common_pb2.Empty | None = ..., + range: _common_pb2.Empty | None = ..., + array: Global___ValInit | None = ..., + meta: _common_pb2.Metadata | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal[ + "array", + b"array", + "boolean", + b"boolean", + "floating", + b"floating", + "integer", + b"integer", + "meta", + b"meta", + "range", + b"range", + "set", + b"set", + "struct", + b"struct", + "text", + b"text", + "val", + b"val", + ] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "array", + b"array", + "boolean", + b"boolean", + "floating", + b"floating", + "integer", + b"integer", + "meta", + b"meta", + "range", + b"range", + "set", + b"set", + "struct", + b"struct", + "text", + b"text", + "val", + b"val", + ] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_val: _TypeAlias = _typing.Literal[ + "floating", "integer", "boolean", "text", "set", "struct", "range", "array" + ] + _WhichOneofArgType_val: _TypeAlias = _typing.Literal["val", b"val"] + + def WhichOneof(self, oneof_group: _WhichOneofArgType_val) -> _WhichOneofReturnType_val | None: ... + +Global___ValInit: _TypeAlias = ValInit diff --git a/edg/edgir/lit_pb2.py b/edg/edgir/lit_pb2.py index 96d84789c..5fa7a1533 100644 --- a/edg/edgir/lit_pb2.py +++ b/edg/edgir/lit_pb2.py @@ -1,17 +1,22 @@ """Generated protocol buffer code.""" + from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database + _sym_db = _symbol_database.Default() from ..edgir import common_pb2 as edgir_dot_common__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0fedgir/lit.proto\x12\tedgir.lit\x1a\x12edgir/common.proto"\x17\n\x08FloatLit\x12\x0b\n\x03val\x18\x01 \x01(\x01"\x15\n\x06IntLit\x12\x0b\n\x03val\x18\x01 \x01(\x12"\x16\n\x07BoolLit\x12\x0b\n\x03val\x18\x01 \x01(\x08"\x16\n\x07TextLit\x12\x0b\n\x03val\x18\x01 \x01(\t"V\n\x08RangeLit\x12$\n\x07minimum\x18\x01 \x01(\x0b2\x13.edgir.lit.ValueLit\x12$\n\x07maximum\x18\x02 \x01(\x0b2\x13.edgir.lit.ValueLit"\x84\x01\n\tStructLit\x122\n\x07members\x18\x01 \x03(\x0b2!.edgir.lit.StructLit.MembersEntry\x1aC\n\x0cMembersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12"\n\x05value\x18\x02 \x01(\x0b2\x13.edgir.lit.ValueLit:\x028\x01"-\n\x08ArrayLit\x12!\n\x04elts\x18\x01 \x03(\x0b2\x13.edgir.lit.ValueLit"\xc6\x02\n\x08ValueLit\x12\'\n\x08floating\x18\x01 \x01(\x0b2\x13.edgir.lit.FloatLitH\x00\x12$\n\x07integer\x18\x02 \x01(\x0b2\x11.edgir.lit.IntLitH\x00\x12%\n\x07boolean\x18\x03 \x01(\x0b2\x12.edgir.lit.BoolLitH\x00\x12"\n\x04text\x18\x04 \x01(\x0b2\x12.edgir.lit.TextLitH\x00\x12&\n\x06struct\x18\t \x01(\x0b2\x14.edgir.lit.StructLitH\x00\x12$\n\x05range\x18\n \x01(\x0b2\x13.edgir.lit.RangeLitH\x00\x12$\n\x05array\x18\x0b \x01(\x0b2\x13.edgir.lit.ArrayLitH\x00\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.MetadataB\x06\n\x04typeb\x06proto3') + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n\x0fedgir/lit.proto\x12\tedgir.lit\x1a\x12edgir/common.proto"\x17\n\x08FloatLit\x12\x0b\n\x03val\x18\x01 \x01(\x01"\x15\n\x06IntLit\x12\x0b\n\x03val\x18\x01 \x01(\x12"\x16\n\x07BoolLit\x12\x0b\n\x03val\x18\x01 \x01(\x08"\x16\n\x07TextLit\x12\x0b\n\x03val\x18\x01 \x01(\t"V\n\x08RangeLit\x12$\n\x07minimum\x18\x01 \x01(\x0b2\x13.edgir.lit.ValueLit\x12$\n\x07maximum\x18\x02 \x01(\x0b2\x13.edgir.lit.ValueLit"\x84\x01\n\tStructLit\x122\n\x07members\x18\x01 \x03(\x0b2!.edgir.lit.StructLit.MembersEntry\x1aC\n\x0cMembersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12"\n\x05value\x18\x02 \x01(\x0b2\x13.edgir.lit.ValueLit:\x028\x01"-\n\x08ArrayLit\x12!\n\x04elts\x18\x01 \x03(\x0b2\x13.edgir.lit.ValueLit"\xc6\x02\n\x08ValueLit\x12\'\n\x08floating\x18\x01 \x01(\x0b2\x13.edgir.lit.FloatLitH\x00\x12$\n\x07integer\x18\x02 \x01(\x0b2\x11.edgir.lit.IntLitH\x00\x12%\n\x07boolean\x18\x03 \x01(\x0b2\x12.edgir.lit.BoolLitH\x00\x12"\n\x04text\x18\x04 \x01(\x0b2\x12.edgir.lit.TextLitH\x00\x12&\n\x06struct\x18\t \x01(\x0b2\x14.edgir.lit.StructLitH\x00\x12$\n\x05range\x18\n \x01(\x0b2\x13.edgir.lit.RangeLitH\x00\x12$\n\x05array\x18\x0b \x01(\x0b2\x13.edgir.lit.ArrayLitH\x00\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.MetadataB\x06\n\x04typeb\x06proto3' +) _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'edgir.lit_pb2', globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "edgir.lit_pb2", globals()) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None _STRUCTLIT_MEMBERSENTRY._options = None - _STRUCTLIT_MEMBERSENTRY._serialized_options = b'8\x01' + _STRUCTLIT_MEMBERSENTRY._serialized_options = b"8\x01" _FLOATLIT._serialized_start = 50 _FLOATLIT._serialized_end = 73 _INTLIT._serialized_start = 75 @@ -29,4 +34,4 @@ _ARRAYLIT._serialized_start = 369 _ARRAYLIT._serialized_end = 414 _VALUELIT._serialized_start = 417 - _VALUELIT._serialized_end = 743 \ No newline at end of file + _VALUELIT._serialized_end = 743 diff --git a/edg/edgir/lit_pb2.pyi b/edg/edgir/lit_pb2.pyi index 7d821ab3c..1ed644162 100644 --- a/edg/edgir/lit_pb2.pyi +++ b/edg/edgir/lit_pb2.pyi @@ -7,6 +7,7 @@ Package : edg.lit Literals for assorted priitive types, i.e fixed constant values. """ + from collections import abc as _abc from edgir import common_pb2 as _common_pb2 from google.protobuf import descriptor as _descriptor @@ -15,6 +16,7 @@ from google.protobuf.internal import containers as _containers import builtins as _builtins import sys import typing as _typing + if sys.version_info >= (3, 10): from typing import TypeAlias as _TypeAlias else: @@ -26,16 +28,16 @@ class FloatLit(_message.Message): """* The core expression primitives we start with are the value literals that we can use """ + DESCRIPTOR: _descriptor.Descriptor VAL_FIELD_NUMBER: _builtins.int val: _builtins.float - def __init__(self, *, val: _builtins.float=...) -> None: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['val', b'val'] + def __init__(self, *, val: _builtins.float = ...) -> None: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["val", b"val"] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___FloatLit: _TypeAlias = FloatLit @_typing.final @@ -44,12 +46,11 @@ class IntLit(_message.Message): VAL_FIELD_NUMBER: _builtins.int val: _builtins.int - def __init__(self, *, val: _builtins.int=...) -> None: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['val', b'val'] + def __init__(self, *, val: _builtins.int = ...) -> None: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["val", b"val"] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___IntLit: _TypeAlias = IntLit @_typing.final @@ -58,12 +59,11 @@ class BoolLit(_message.Message): VAL_FIELD_NUMBER: _builtins.int val: _builtins.bool - def __init__(self, *, val: _builtins.bool=...) -> None: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['val', b'val'] + def __init__(self, *, val: _builtins.bool = ...) -> None: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["val", b"val"] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___BoolLit: _TypeAlias = BoolLit @_typing.final @@ -72,12 +72,11 @@ class TextLit(_message.Message): VAL_FIELD_NUMBER: _builtins.int val: _builtins.str - def __init__(self, *, val: _builtins.str=...) -> None: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['val', b'val'] + def __init__(self, *, val: _builtins.str = ...) -> None: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["val", b"val"] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___TextLit: _TypeAlias = TextLit @_typing.final @@ -87,23 +86,17 @@ class RangeLit(_message.Message): MAXIMUM_FIELD_NUMBER: _builtins.int @_builtins.property - def minimum(self) -> Global___ValueLit: - ... - + def minimum(self) -> Global___ValueLit: ... @_builtins.property - def maximum(self) -> Global___ValueLit: - ... + def maximum(self) -> Global___ValueLit: ... + def __init__(self, *, minimum: Global___ValueLit | None = ..., maximum: Global___ValueLit | None = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["maximum", b"maximum", "minimum", b"minimum"] - def __init__(self, *, minimum: Global___ValueLit | None=..., maximum: Global___ValueLit | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['maximum', b'maximum', 'minimum', b'minimum'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["maximum", b"maximum", "minimum", b"minimum"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['maximum', b'maximum', 'minimum', b'minimum'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___RangeLit: _TypeAlias = RangeLit @_typing.final @@ -118,31 +111,24 @@ class StructLit(_message.Message): key: _builtins.str @_builtins.property - def value(self) -> Global___ValueLit: - ... + def value(self) -> Global___ValueLit: ... + def __init__(self, *, key: _builtins.str = ..., value: Global___ValueLit | None = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["value", b"value"] - def __init__(self, *, key: _builtins.str=..., value: Global___ValueLit | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['value', b'value'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["key", b"key", "value", b"value"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['key', b'key', 'value', b'value'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... MEMBERS_FIELD_NUMBER: _builtins.int @_builtins.property - def members(self) -> _containers.MessageMap[_builtins.str, Global___ValueLit]: - ... + def members(self) -> _containers.MessageMap[_builtins.str, Global___ValueLit]: ... + def __init__(self, *, members: _abc.Mapping[_builtins.str, Global___ValueLit] | None = ...) -> None: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["members", b"members"] - def __init__(self, *, members: _abc.Mapping[_builtins.str, Global___ValueLit] | None=...) -> None: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['members', b'members'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___StructLit: _TypeAlias = StructLit @_typing.final @@ -151,15 +137,12 @@ class ArrayLit(_message.Message): ELTS_FIELD_NUMBER: _builtins.int @_builtins.property - def elts(self) -> _containers.RepeatedCompositeFieldContainer[Global___ValueLit]: - ... + def elts(self) -> _containers.RepeatedCompositeFieldContainer[Global___ValueLit]: ... + def __init__(self, *, elts: _abc.Iterable[Global___ValueLit] | None = ...) -> None: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["elts", b"elts"] - def __init__(self, *, elts: _abc.Iterable[Global___ValueLit] | None=...) -> None: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['elts', b'elts'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___ArrayLit: _TypeAlias = ArrayLit @_typing.final @@ -175,50 +158,82 @@ class ValueLit(_message.Message): META_FIELD_NUMBER: _builtins.int @_builtins.property - def floating(self) -> Global___FloatLit: - ... - + def floating(self) -> Global___FloatLit: ... @_builtins.property - def integer(self) -> Global___IntLit: - ... - + def integer(self) -> Global___IntLit: ... @_builtins.property - def boolean(self) -> Global___BoolLit: - ... - + def boolean(self) -> Global___BoolLit: ... @_builtins.property - def text(self) -> Global___TextLit: - ... - + def text(self) -> Global___TextLit: ... @_builtins.property - def struct(self) -> Global___StructLit: - ... - + def struct(self) -> Global___StructLit: ... @_builtins.property - def range(self) -> Global___RangeLit: - ... - + def range(self) -> Global___RangeLit: ... @_builtins.property - def array(self) -> Global___ArrayLit: - ... - + def array(self) -> Global___ArrayLit: ... @_builtins.property - def meta(self) -> _common_pb2.Metadata: - ... - - def __init__(self, *, floating: Global___FloatLit | None=..., integer: Global___IntLit | None=..., boolean: Global___BoolLit | None=..., text: Global___TextLit | None=..., struct: Global___StructLit | None=..., range: Global___RangeLit | None=..., array: Global___ArrayLit | None=..., meta: _common_pb2.Metadata | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['array', b'array', 'boolean', b'boolean', 'floating', b'floating', 'integer', b'integer', 'meta', b'meta', 'range', b'range', 'struct', b'struct', 'text', b'text', 'type', b'type'] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['array', b'array', 'boolean', b'boolean', 'floating', b'floating', 'integer', b'integer', 'meta', b'meta', 'range', b'range', 'struct', b'struct', 'text', b'text', 'type', b'type'] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... - _WhichOneofReturnType_type: _TypeAlias = _typing.Literal['floating', 'integer', 'boolean', 'text', 'struct', 'range', 'array'] - _WhichOneofArgType_type: _TypeAlias = _typing.Literal['type', b'type'] - - def WhichOneof(self, oneof_group: _WhichOneofArgType_type) -> _WhichOneofReturnType_type | None: - ... -Global___ValueLit: _TypeAlias = ValueLit \ No newline at end of file + def meta(self) -> _common_pb2.Metadata: ... + def __init__( + self, + *, + floating: Global___FloatLit | None = ..., + integer: Global___IntLit | None = ..., + boolean: Global___BoolLit | None = ..., + text: Global___TextLit | None = ..., + struct: Global___StructLit | None = ..., + range: Global___RangeLit | None = ..., + array: Global___ArrayLit | None = ..., + meta: _common_pb2.Metadata | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal[ + "array", + b"array", + "boolean", + b"boolean", + "floating", + b"floating", + "integer", + b"integer", + "meta", + b"meta", + "range", + b"range", + "struct", + b"struct", + "text", + b"text", + "type", + b"type", + ] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "array", + b"array", + "boolean", + b"boolean", + "floating", + b"floating", + "integer", + b"integer", + "meta", + b"meta", + "range", + b"range", + "struct", + b"struct", + "text", + b"text", + "type", + b"type", + ] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_type: _TypeAlias = _typing.Literal[ + "floating", "integer", "boolean", "text", "struct", "range", "array" + ] + _WhichOneofArgType_type: _TypeAlias = _typing.Literal["type", b"type"] + + def WhichOneof(self, oneof_group: _WhichOneofArgType_type) -> _WhichOneofReturnType_type | None: ... + +Global___ValueLit: _TypeAlias = ValueLit diff --git a/edg/edgir/name_pb2.py b/edg/edgir/name_pb2.py index 1b64ac05f..5d32702a7 100644 --- a/edg/edgir/name_pb2.py +++ b/edg/edgir/name_pb2.py @@ -1,16 +1,21 @@ """Generated protocol buffer code.""" + from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database + _sym_db = _symbol_database.Default() from ..edgir import common_pb2 as edgir_dot_common__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10edgir/name.proto\x12\nedgir.name\x1a\x12edgir/common.proto"O\n\tNamespace\x12\x0f\n\x05basic\x18\x01 \x01(\tH\x00\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.MetadataB\x0b\n\tnamespace"A\n\x0bLibraryName\x12\x0c\n\x04name\x18\x02 \x01(\t\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadatab\x06proto3') + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n\x10edgir/name.proto\x12\nedgir.name\x1a\x12edgir/common.proto"O\n\tNamespace\x12\x0f\n\x05basic\x18\x01 \x01(\tH\x00\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.MetadataB\x0b\n\tnamespace"A\n\x0bLibraryName\x12\x0c\n\x04name\x18\x02 \x01(\t\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadatab\x06proto3' +) _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'edgir.name_pb2', globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "edgir.name_pb2", globals()) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None _NAMESPACE._serialized_start = 52 _NAMESPACE._serialized_end = 131 _LIBRARYNAME._serialized_start = 133 - _LIBRARYNAME._serialized_end = 198 \ No newline at end of file + _LIBRARYNAME._serialized_end = 198 diff --git a/edg/edgir/name_pb2.pyi b/edg/edgir/name_pb2.pyi index 50564b2fe..5b30f799c 100644 --- a/edg/edgir/name_pb2.pyi +++ b/edg/edgir/name_pb2.pyi @@ -10,12 +10,14 @@ There are three major classes of name in edg: - LocalNames, which help organize elements relative to each other. - LibraryNames, which we use to identify specific libraries. """ + from edgir import common_pb2 as _common_pb2 from google.protobuf import descriptor as _descriptor from google.protobuf import message as _message import builtins as _builtins import sys import typing as _typing + if sys.version_info >= (3, 10): from typing import TypeAlias as _TypeAlias else: @@ -29,6 +31,7 @@ class Namespace(_message.Message): over items in the library. It lets us group elements in categories that are orthogonal to the usual Block, Port, Link, ontology. """ + DESCRIPTOR: _descriptor.Descriptor BASIC_FIELD_NUMBER: _builtins.int META_FIELD_NUMBER: _builtins.int @@ -36,24 +39,19 @@ class Namespace(_message.Message): "* Basic namespaces are a way to organize library elements into a\n useful hirearchy (e.g. 'Core.*' for the most primitive definitions\n that we define, or 'NXP.*' for NXP made components.)\n\n Basic namespaces should have the following properties:\n\n - First char is a capital letter\n - All other chars must be letters, numbers, '-', '<', '>'\n - CamelCase is preffered, don't use any symbols in the name\n if possible.\n " @_builtins.property - def meta(self) -> _common_pb2.Metadata: - ... + def meta(self) -> _common_pb2.Metadata: ... + def __init__(self, *, basic: _builtins.str = ..., meta: _common_pb2.Metadata | None = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["basic", b"basic", "meta", b"meta", "namespace", b"namespace"] - def __init__(self, *, basic: _builtins.str=..., meta: _common_pb2.Metadata | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['basic', b'basic', 'meta', b'meta', 'namespace', b'namespace'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["basic", b"basic", "meta", b"meta", "namespace", b"namespace"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['basic', b'basic', 'meta', b'meta', 'namespace', b'namespace'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_namespace: _TypeAlias = _typing.Literal["basic"] + _WhichOneofArgType_namespace: _TypeAlias = _typing.Literal["namespace", b"namespace"] - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... - _WhichOneofReturnType_namespace: _TypeAlias = _typing.Literal['basic'] - _WhichOneofArgType_namespace: _TypeAlias = _typing.Literal['namespace', b'namespace'] + def WhichOneof(self, oneof_group: _WhichOneofArgType_namespace) -> _WhichOneofReturnType_namespace | None: ... - def WhichOneof(self, oneof_group: _WhichOneofArgType_namespace) -> _WhichOneofReturnType_namespace | None: - ... Global___Namespace: _TypeAlias = Namespace @_typing.final @@ -63,6 +61,7 @@ class LibraryName(_message.Message): This can be the initial element in a path or reference. """ + DESCRIPTOR: _descriptor.Descriptor NAME_FIELD_NUMBER: _builtins.int META_FIELD_NUMBER: _builtins.int @@ -70,17 +69,13 @@ class LibraryName(_message.Message): "* Since libraries allow for inheritance, we will often want to say\n this element, defined in *this* particular library.\n\n In those cases we want to be able to specify the relevant library\n by its identifier.\n\n Otherwise we assume it's somehow implicit which library we're\n talking about.\n " @_builtins.property - def meta(self) -> _common_pb2.Metadata: - ... + def meta(self) -> _common_pb2.Metadata: ... + def __init__(self, *, name: _builtins.str = ..., meta: _common_pb2.Metadata | None = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta"] - def __init__(self, *, name: _builtins.str=..., meta: _common_pb2.Metadata | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta", "name", b"name"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta', 'name', b'name'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... -Global___LibraryName: _TypeAlias = LibraryName \ No newline at end of file +Global___LibraryName: _TypeAlias = LibraryName diff --git a/edg/edgir/ref_pb2.py b/edg/edgir/ref_pb2.py index 154cb44fb..ee4f3fd9c 100644 --- a/edg/edgir/ref_pb2.py +++ b/edg/edgir/ref_pb2.py @@ -1,14 +1,19 @@ """Generated protocol buffer code.""" + from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database + _sym_db = _symbol_database.Default() from ..edgir import common_pb2 as edgir_dot_common__pb2 from ..edgir import name_pb2 as edgir_dot_name__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0fedgir/ref.proto\x12\tedgir.ref\x1a\x12edgir/common.proto\x1a\x10edgir/name.proto"f\n\tLocalStep\x12-\n\x0ereserved_param\x18\x01 \x01(\x0e2\x13.edgir.ref.ReservedH\x00\x12\x12\n\x08allocate\x18\x02 \x01(\tH\x00\x12\x0e\n\x04name\x18\x03 \x01(\tH\x00B\x06\n\x04step"W\n\tLocalPath\x12#\n\x05steps\x18\x01 \x03(\x0b2\x14.edgir.ref.LocalStep\x12%\n\x04meta\x18\xff\x01 \x01(\x0b2\x16.edgir.common.Metadata"\xa8\x01\n\x0bLibraryPath\x12&\n\x05start\x18\x01 \x01(\x0b2\x17.edgir.name.LibraryName\x12$\n\x05steps\x18\x02 \x03(\x0b2\x15.edgir.name.Namespace\x12$\n\x06target\x18\x03 \x01(\x0b2\x14.edgir.ref.LocalStep\x12%\n\x04meta\x18\xff\x01 \x01(\x0b2\x16.edgir.common.Metadata*r\n\x08Reserved\x12\r\n\tUNDEFINED\x10\x00\x12\x12\n\x0eCONNECTED_LINK\x10\x01\x12\x10\n\x0cIS_CONNECTED\x10(\x12\n\n\x06LENGTH\x10*\x12\x08\n\x04NAME\x10,\x12\x0c\n\x08ELEMENTS\x10-\x12\r\n\tALLOCATED\x10.b\x06proto3') + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n\x0fedgir/ref.proto\x12\tedgir.ref\x1a\x12edgir/common.proto\x1a\x10edgir/name.proto"f\n\tLocalStep\x12-\n\x0ereserved_param\x18\x01 \x01(\x0e2\x13.edgir.ref.ReservedH\x00\x12\x12\n\x08allocate\x18\x02 \x01(\tH\x00\x12\x0e\n\x04name\x18\x03 \x01(\tH\x00B\x06\n\x04step"W\n\tLocalPath\x12#\n\x05steps\x18\x01 \x03(\x0b2\x14.edgir.ref.LocalStep\x12%\n\x04meta\x18\xff\x01 \x01(\x0b2\x16.edgir.common.Metadata"\xa8\x01\n\x0bLibraryPath\x12&\n\x05start\x18\x01 \x01(\x0b2\x17.edgir.name.LibraryName\x12$\n\x05steps\x18\x02 \x03(\x0b2\x15.edgir.name.Namespace\x12$\n\x06target\x18\x03 \x01(\x0b2\x14.edgir.ref.LocalStep\x12%\n\x04meta\x18\xff\x01 \x01(\x0b2\x16.edgir.common.Metadata*r\n\x08Reserved\x12\r\n\tUNDEFINED\x10\x00\x12\x12\n\x0eCONNECTED_LINK\x10\x01\x12\x10\n\x0cIS_CONNECTED\x10(\x12\n\n\x06LENGTH\x10*\x12\x08\n\x04NAME\x10,\x12\x0c\n\x08ELEMENTS\x10-\x12\r\n\tALLOCATED\x10.b\x06proto3' +) _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'edgir.ref_pb2', globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "edgir.ref_pb2", globals()) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None _RESERVED._serialized_start = 432 @@ -18,4 +23,4 @@ _LOCALPATH._serialized_start = 172 _LOCALPATH._serialized_end = 259 _LIBRARYPATH._serialized_start = 262 - _LIBRARYPATH._serialized_end = 430 \ No newline at end of file + _LIBRARYPATH._serialized_end = 430 diff --git a/edg/edgir/ref_pb2.pyi b/edg/edgir/ref_pb2.pyi index 4cb753aaf..992c4f924 100644 --- a/edg/edgir/ref_pb2.pyi +++ b/edg/edgir/ref_pb2.pyi @@ -11,6 +11,7 @@ referencing different elements in a designs or libraries. We enforce certain structural properties by having a series of nested 'steps' that determine the next step in a path reference. """ + from collections import abc as _abc from edgir import common_pb2 as _common_pb2 from edgir import name_pb2 as _name_pb2 @@ -21,6 +22,7 @@ from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper import builtins as _builtins import sys import typing as _typing + if sys.version_info >= (3, 10): from typing import TypeAlias as _TypeAlias else: @@ -28,41 +30,42 @@ else: DESCRIPTOR: _descriptor.FileDescriptor class _Reserved: - ValueType = _typing.NewType('ValueType', _builtins.int) + ValueType = _typing.NewType("ValueType", _builtins.int) V: _TypeAlias = ValueType class _ReservedEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_Reserved.ValueType], _builtins.type): DESCRIPTOR: _descriptor.EnumDescriptor UNDEFINED: _Reserved.ValueType CONNECTED_LINK: _Reserved.ValueType - '* Directions we could move' + "* Directions we could move" IS_CONNECTED: _Reserved.ValueType - '* reserved parameters\n true implies CONNECTED_LINK resolves; not available on PortArray\n ' + "* reserved parameters\n true implies CONNECTED_LINK resolves; not available on PortArray\n " LENGTH: _Reserved.ValueType - ' EXISTS = 41;\n available on PortArray and LinkArray\n ' + " EXISTS = 41;\n available on PortArray and LinkArray\n " NAME: _Reserved.ValueType ELEMENTS: _Reserved.ValueType - 'available on PortArray and LinkArray, returns a list of string of element names' + "available on PortArray and LinkArray, returns a list of string of element names" ALLOCATED: _Reserved.ValueType - 'cannot be used as a generator dependency\n available on PortArray, returns a list of string of incoming connection names,\n ' + "cannot be used as a generator dependency\n available on PortArray, returns a list of string of incoming connection names,\n " class Reserved(_Reserved, metaclass=_ReservedEnumTypeWrapper): """* These are reserved terms that we'll end up using in various places. I'd rather have these in the block/link/bridges where they're going to exist, but that's not possible without polymorphism protibuf doesn't have """ + UNDEFINED: Reserved.ValueType CONNECTED_LINK: Reserved.ValueType -'* Directions we could move' +"* Directions we could move" IS_CONNECTED: Reserved.ValueType -'* reserved parameters\ntrue implies CONNECTED_LINK resolves; not available on PortArray\n' +"* reserved parameters\ntrue implies CONNECTED_LINK resolves; not available on PortArray\n" LENGTH: Reserved.ValueType -' EXISTS = 41;\navailable on PortArray and LinkArray\n' +" EXISTS = 41;\navailable on PortArray and LinkArray\n" NAME: Reserved.ValueType ELEMENTS: Reserved.ValueType -'available on PortArray and LinkArray, returns a list of string of element names' +"available on PortArray and LinkArray, returns a list of string of element names" ALLOCATED: Reserved.ValueType -'cannot be used as a generator dependency\navailable on PortArray, returns a list of string of incoming connection names,\n' +"cannot be used as a generator dependency\navailable on PortArray, returns a list of string of incoming connection names,\n" Global___Reserved: _TypeAlias = Reserved @_typing.final @@ -73,31 +76,39 @@ class LocalStep(_message.Message): The directions encode the type of thing we are referencing, but to the user all of these look just like local variables """ + DESCRIPTOR: _descriptor.Descriptor RESERVED_PARAM_FIELD_NUMBER: _builtins.int ALLOCATE_FIELD_NUMBER: _builtins.int NAME_FIELD_NUMBER: _builtins.int reserved_param: Global___Reserved.ValueType allocate: _builtins.str - 'Allocates a new element in an array, valid for arrays only.\n Empty string means automatically allocated, while a non-empty string is a suggested name.\n ' + "Allocates a new element in an array, valid for arrays only.\n Empty string means automatically allocated, while a non-empty string is a suggested name.\n " name: _builtins.str "*\n A local name is what something is called in the context of its parent,\n whether that parent is a namespace (as in the library) or some other\n element (as in a design or heirarchy block).\n\n localNames should have the following properties:\n\n - First char is a lower case letter\n - All other chars must be letters, numbers, '-', '<', '>'\n - lowerCamelCase is preffered, don't use any symbols in the name\n if possible.\n\n These are style guidelines, literally any string will work.\n " - def __init__(self, *, reserved_param: Global___Reserved.ValueType=..., allocate: _builtins.str=..., name: _builtins.str=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['allocate', b'allocate', 'name', b'name', 'reserved_param', b'reserved_param', 'step', b'step'] + def __init__( + self, + *, + reserved_param: Global___Reserved.ValueType = ..., + allocate: _builtins.str = ..., + name: _builtins.str = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal[ + "allocate", b"allocate", "name", b"name", "reserved_param", b"reserved_param", "step", b"step" + ] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['allocate', b'allocate', 'name', b'name', 'reserved_param', b'reserved_param', 'step', b'step'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "allocate", b"allocate", "name", b"name", "reserved_param", b"reserved_param", "step", b"step" + ] - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... - _WhichOneofReturnType_step: _TypeAlias = _typing.Literal['reserved_param', 'allocate', 'name'] - _WhichOneofArgType_step: _TypeAlias = _typing.Literal['step', b'step'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_step: _TypeAlias = _typing.Literal["reserved_param", "allocate", "name"] + _WhichOneofArgType_step: _TypeAlias = _typing.Literal["step", b"step"] + + def WhichOneof(self, oneof_group: _WhichOneofArgType_step) -> _WhichOneofReturnType_step | None: ... - def WhichOneof(self, oneof_group: _WhichOneofArgType_step) -> _WhichOneofReturnType_step | None: - ... Global___LocalStep: _TypeAlias = LocalStep @_typing.final @@ -105,28 +116,25 @@ class LocalPath(_message.Message): """* This is a path from a local context to some other local context. To be used as a reference. """ + DESCRIPTOR: _descriptor.Descriptor STEPS_FIELD_NUMBER: _builtins.int META_FIELD_NUMBER: _builtins.int @_builtins.property - def steps(self) -> _containers.RepeatedCompositeFieldContainer[Global___LocalStep]: - ... - + def steps(self) -> _containers.RepeatedCompositeFieldContainer[Global___LocalStep]: ... @_builtins.property - def meta(self) -> _common_pb2.Metadata: - ... + def meta(self) -> _common_pb2.Metadata: ... + def __init__( + self, *, steps: _abc.Iterable[Global___LocalStep] | None = ..., meta: _common_pb2.Metadata | None = ... + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta"] - def __init__(self, *, steps: _abc.Iterable[Global___LocalStep] | None=..., meta: _common_pb2.Metadata | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta", "steps", b"steps"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta', 'steps', b'steps'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___LocalPath: _TypeAlias = LocalPath @_typing.final @@ -134,6 +142,7 @@ class LibraryPath(_message.Message): """* This is a path to an element within a library from the root of a library. To be used as a way to reference such elements. """ + DESCRIPTOR: _descriptor.Descriptor START_FIELD_NUMBER: _builtins.int STEPS_FIELD_NUMBER: _builtins.int @@ -141,29 +150,28 @@ class LibraryPath(_message.Message): META_FIELD_NUMBER: _builtins.int @_builtins.property - def start(self) -> _name_pb2.LibraryName: - ... - + def start(self) -> _name_pb2.LibraryName: ... @_builtins.property - def steps(self) -> _containers.RepeatedCompositeFieldContainer[_name_pb2.Namespace]: - ... - + def steps(self) -> _containers.RepeatedCompositeFieldContainer[_name_pb2.Namespace]: ... @_builtins.property - def target(self) -> Global___LocalStep: - ... - + def target(self) -> Global___LocalStep: ... @_builtins.property - def meta(self) -> _common_pb2.Metadata: - ... - - def __init__(self, *, start: _name_pb2.LibraryName | None=..., steps: _abc.Iterable[_name_pb2.Namespace] | None=..., target: Global___LocalStep | None=..., meta: _common_pb2.Metadata | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta', 'start', b'start', 'target', b'target'] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['meta', b'meta', 'start', b'start', 'steps', b'steps', 'target', b'target'] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... -Global___LibraryPath: _TypeAlias = LibraryPath \ No newline at end of file + def meta(self) -> _common_pb2.Metadata: ... + def __init__( + self, + *, + start: _name_pb2.LibraryName | None = ..., + steps: _abc.Iterable[_name_pb2.Namespace] | None = ..., + target: Global___LocalStep | None = ..., + meta: _common_pb2.Metadata | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["meta", b"meta", "start", b"start", "target", b"target"] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "meta", b"meta", "start", b"start", "steps", b"steps", "target", b"target" + ] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___LibraryPath: _TypeAlias = LibraryPath diff --git a/edg/edgir/schema_pb2.py b/edg/edgir/schema_pb2.py index 46253e26c..515fd4516 100644 --- a/edg/edgir/schema_pb2.py +++ b/edg/edgir/schema_pb2.py @@ -1,18 +1,23 @@ """Generated protocol buffer code.""" + from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database + _sym_db = _symbol_database.Default() from ..edgir import common_pb2 as edgir_dot_common__pb2 from ..edgir import elem_pb2 as edgir_dot_elem__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12edgir/schema.proto\x12\x0cedgir.schema\x1a\x12edgir/common.proto\x1a\x10edgir/elem.proto"\xf5\x03\n\x07Library\x12*\n\x02id\x18\x01 \x01(\x0b2\x1e.edgir.schema.Library.LibIdent\x12\x0f\n\x07imports\x18\x02 \x03(\t\x12&\n\x04root\x18\n \x01(\x0b2\x18.edgir.schema.Library.NS\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata\x1a\xc4\x02\n\x02NS\x126\n\x07members\x18\x01 \x03(\x0b2%.edgir.schema.Library.NS.MembersEntry\x1a\xb7\x01\n\x03Val\x12 \n\x04port\x18\n \x01(\x0b2\x10.edgir.elem.PortH\x00\x125\n\x0fhierarchy_block\x18\r \x01(\x0b2\x1a.edgir.elem.HierarchyBlockH\x00\x12 \n\x04link\x18\x0e \x01(\x0b2\x10.edgir.elem.LinkH\x00\x12-\n\tnamespace\x18\x14 \x01(\x0b2\x18.edgir.schema.Library.NSH\x00B\x06\n\x04type\x1aL\n\x0cMembersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12+\n\x05value\x18\x02 \x01(\x0b2\x1c.edgir.schema.Library.NS.Val:\x028\x01\x1a\x18\n\x08LibIdent\x12\x0c\n\x04name\x18\x01 \x01(\t"6\n\x06Design\x12,\n\x08contents\x18\x02 \x01(\x0b2\x1a.edgir.elem.HierarchyBlockb\x06proto3') + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n\x12edgir/schema.proto\x12\x0cedgir.schema\x1a\x12edgir/common.proto\x1a\x10edgir/elem.proto"\xf5\x03\n\x07Library\x12*\n\x02id\x18\x01 \x01(\x0b2\x1e.edgir.schema.Library.LibIdent\x12\x0f\n\x07imports\x18\x02 \x03(\t\x12&\n\x04root\x18\n \x01(\x0b2\x18.edgir.schema.Library.NS\x12$\n\x04meta\x18\x7f \x01(\x0b2\x16.edgir.common.Metadata\x1a\xc4\x02\n\x02NS\x126\n\x07members\x18\x01 \x03(\x0b2%.edgir.schema.Library.NS.MembersEntry\x1a\xb7\x01\n\x03Val\x12 \n\x04port\x18\n \x01(\x0b2\x10.edgir.elem.PortH\x00\x125\n\x0fhierarchy_block\x18\r \x01(\x0b2\x1a.edgir.elem.HierarchyBlockH\x00\x12 \n\x04link\x18\x0e \x01(\x0b2\x10.edgir.elem.LinkH\x00\x12-\n\tnamespace\x18\x14 \x01(\x0b2\x18.edgir.schema.Library.NSH\x00B\x06\n\x04type\x1aL\n\x0cMembersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12+\n\x05value\x18\x02 \x01(\x0b2\x1c.edgir.schema.Library.NS.Val:\x028\x01\x1a\x18\n\x08LibIdent\x12\x0c\n\x04name\x18\x01 \x01(\t"6\n\x06Design\x12,\n\x08contents\x18\x02 \x01(\x0b2\x1a.edgir.elem.HierarchyBlockb\x06proto3' +) _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'edgir.schema_pb2', globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "edgir.schema_pb2", globals()) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None _LIBRARY_NS_MEMBERSENTRY._options = None - _LIBRARY_NS_MEMBERSENTRY._serialized_options = b'8\x01' + _LIBRARY_NS_MEMBERSENTRY._serialized_options = b"8\x01" _LIBRARY._serialized_start = 75 _LIBRARY._serialized_end = 576 _LIBRARY_NS._serialized_start = 226 @@ -24,4 +29,4 @@ _LIBRARY_LIBIDENT._serialized_start = 552 _LIBRARY_LIBIDENT._serialized_end = 576 _DESIGN._serialized_start = 578 - _DESIGN._serialized_end = 632 \ No newline at end of file + _DESIGN._serialized_end = 632 diff --git a/edg/edgir/schema_pb2.pyi b/edg/edgir/schema_pb2.pyi index eeb7ebf64..3080870ab 100644 --- a/edg/edgir/schema_pb2.pyi +++ b/edg/edgir/schema_pb2.pyi @@ -8,6 +8,7 @@ Package : edg.schema These types contain the highest level data structures we use to describe sets of blocks, ports, and links. """ + from collections import abc as _abc from edgir import common_pb2 as _common_pb2 from edgir import elem_pb2 as _elem_pb2 @@ -17,6 +18,7 @@ from google.protobuf.internal import containers as _containers import builtins as _builtins import sys import typing as _typing + if sys.version_info >= (3, 10): from typing import TypeAlias as _TypeAlias else: @@ -35,11 +37,13 @@ class Library(_message.Message): or definitional conflicts. This means that we can shuffle around partial libraries, for merging, modification, etc.. """ + DESCRIPTOR: _descriptor.Descriptor @_typing.final class NS(_message.Message): """* Library Namespace, avoiding collision w/ edg.name.Namespace""" + DESCRIPTOR: _descriptor.Descriptor @_typing.final @@ -51,36 +55,53 @@ class Library(_message.Message): NAMESPACE_FIELD_NUMBER: _builtins.int @_builtins.property - def port(self) -> _elem_pb2.Port: - ... - + def port(self) -> _elem_pb2.Port: ... @_builtins.property - def hierarchy_block(self) -> _elem_pb2.HierarchyBlock: - ... - + def hierarchy_block(self) -> _elem_pb2.HierarchyBlock: ... @_builtins.property - def link(self) -> _elem_pb2.Link: - ... - + def link(self) -> _elem_pb2.Link: ... @_builtins.property - def namespace(self) -> Global___Library.NS: - ... - - def __init__(self, *, port: _elem_pb2.Port | None=..., hierarchy_block: _elem_pb2.HierarchyBlock | None=..., link: _elem_pb2.Link | None=..., namespace: Global___Library.NS | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['hierarchy_block', b'hierarchy_block', 'link', b'link', 'namespace', b'namespace', 'port', b'port', 'type', b'type'] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['hierarchy_block', b'hierarchy_block', 'link', b'link', 'namespace', b'namespace', 'port', b'port', 'type', b'type'] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... - _WhichOneofReturnType_type: _TypeAlias = _typing.Literal['port', 'hierarchy_block', 'link', 'namespace'] - _WhichOneofArgType_type: _TypeAlias = _typing.Literal['type', b'type'] - - def WhichOneof(self, oneof_group: _WhichOneofArgType_type) -> _WhichOneofReturnType_type | None: - ... + def namespace(self) -> Global___Library.NS: ... + def __init__( + self, + *, + port: _elem_pb2.Port | None = ..., + hierarchy_block: _elem_pb2.HierarchyBlock | None = ..., + link: _elem_pb2.Link | None = ..., + namespace: Global___Library.NS | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal[ + "hierarchy_block", + b"hierarchy_block", + "link", + b"link", + "namespace", + b"namespace", + "port", + b"port", + "type", + b"type", + ] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "hierarchy_block", + b"hierarchy_block", + "link", + b"link", + "namespace", + b"namespace", + "port", + b"port", + "type", + b"type", + ] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_type: _TypeAlias = _typing.Literal["port", "hierarchy_block", "link", "namespace"] + _WhichOneofArgType_type: _TypeAlias = _typing.Literal["type", b"type"] + + def WhichOneof(self, oneof_group: _WhichOneofArgType_type) -> _WhichOneofReturnType_type | None: ... @_typing.final class MembersEntry(_message.Message): @@ -90,83 +111,75 @@ class Library(_message.Message): key: _builtins.str @_builtins.property - def value(self) -> Global___Library.NS.Val: - ... + def value(self) -> Global___Library.NS.Val: ... + def __init__(self, *, key: _builtins.str = ..., value: Global___Library.NS.Val | None = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["value", b"value"] - def __init__(self, *, key: _builtins.str=..., value: Global___Library.NS.Val | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['value', b'value'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["key", b"key", "value", b"value"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['key', b'key', 'value', b'value'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... MEMBERS_FIELD_NUMBER: _builtins.int @_builtins.property - def members(self) -> _containers.MessageMap[_builtins.str, Global___Library.NS.Val]: - ... + def members(self) -> _containers.MessageMap[_builtins.str, Global___Library.NS.Val]: ... + def __init__(self, *, members: _abc.Mapping[_builtins.str, Global___Library.NS.Val] | None = ...) -> None: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["members", b"members"] - def __init__(self, *, members: _abc.Mapping[_builtins.str, Global___Library.NS.Val] | None=...) -> None: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['members', b'members'] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... @_typing.final class LibIdent(_message.Message): """* How we identify a library within a set. Will probably evolve to capture more metadata. """ + DESCRIPTOR: _descriptor.Descriptor NAME_FIELD_NUMBER: _builtins.int name: _builtins.str - def __init__(self, *, name: _builtins.str=...) -> None: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['name', b'name'] + def __init__(self, *, name: _builtins.str = ...) -> None: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["name", b"name"] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... ID_FIELD_NUMBER: _builtins.int IMPORTS_FIELD_NUMBER: _builtins.int ROOT_FIELD_NUMBER: _builtins.int META_FIELD_NUMBER: _builtins.int @_builtins.property - def id(self) -> Global___Library.LibIdent: - ... - + def id(self) -> Global___Library.LibIdent: ... @_builtins.property - def imports(self) -> _containers.RepeatedScalarFieldContainer[_builtins.str]: - ... - + def imports(self) -> _containers.RepeatedScalarFieldContainer[_builtins.str]: ... @_builtins.property - def root(self) -> Global___Library.NS: - ... - + def root(self) -> Global___Library.NS: ... @_builtins.property - def meta(self) -> _common_pb2.Metadata: - ... - - def __init__(self, *, id: Global___Library.LibIdent | None=..., imports: _abc.Iterable[_builtins.str] | None=..., root: Global___Library.NS | None=..., meta: _common_pb2.Metadata | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['id', b'id', 'meta', b'meta', 'root', b'root'] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['id', b'id', 'imports', b'imports', 'meta', b'meta', 'root', b'root'] + def meta(self) -> _common_pb2.Metadata: ... + def __init__( + self, + *, + id: Global___Library.LibIdent | None = ..., + imports: _abc.Iterable[_builtins.str] | None = ..., + root: Global___Library.NS | None = ..., + meta: _common_pb2.Metadata | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["id", b"id", "meta", b"meta", "root", b"root"] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "id", b"id", "imports", b"imports", "meta", b"meta", "root", b"root" + ] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___Library: _TypeAlias = Library @_typing.final class Design(_message.Message): """* This is a Design for an embedded system at some level of abstraction.""" + DESCRIPTOR: _descriptor.Descriptor CONTENTS_FIELD_NUMBER: _builtins.int @@ -174,14 +187,12 @@ class Design(_message.Message): def contents(self) -> _elem_pb2.HierarchyBlock: """* Delegate the actual contents of the design to a hierarchy block, for which ports are ignored""" - def __init__(self, *, contents: _elem_pb2.HierarchyBlock | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['contents', b'contents'] + def __init__(self, *, contents: _elem_pb2.HierarchyBlock | None = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["contents", b"contents"] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["contents", b"contents"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['contents', b'contents'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... -Global___Design: _TypeAlias = Design \ No newline at end of file +Global___Design: _TypeAlias = Design diff --git a/edg/edgrpc/compiler_pb2.py b/edg/edgrpc/compiler_pb2.py index d70190500..0b83d379f 100644 --- a/edg/edgrpc/compiler_pb2.py +++ b/edg/edgrpc/compiler_pb2.py @@ -1,16 +1,21 @@ """Generated protocol buffer code.""" + from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database + _sym_db = _symbol_database.Default() from ..edgir import schema_pb2 as edgir_dot_schema__pb2 from ..edgir import ref_pb2 as edgir_dot_ref__pb2 from ..edgir import lit_pb2 as edgir_dot_lit__pb2 from ..edgrpc import hdl_pb2 as edgrpc_dot_hdl__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15edgrpc/compiler.proto\x12\x0fedgrpc.compiler\x1a\x12edgir/schema.proto\x1a\x0fedgir/ref.proto\x1a\x0fedgir/lit.proto\x1a\x10edgrpc/hdl.proto"^\n\x0bErrorRecord\x12"\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x0f\n\x07details\x18\x04 \x01(\t"e\n\x0fCompilerRequest\x12$\n\x06design\x18\x02 \x01(\x0b2\x14.edgir.schema.Design\x12,\n\x0brefinements\x18\x03 \x01(\x0b2\x17.edgrpc.hdl.Refinements"\x94\x03\n\x0eCompilerResult\x12$\n\x06design\x18\x01 \x01(\x0b2\x14.edgir.schema.Design\x12,\n\x06errors\x18\x04 \x03(\x0b2\x1c.edgrpc.compiler.ErrorRecord\x12;\n\x0csolvedValues\x18\x02 \x03(\x0b2%.edgrpc.compiler.CompilerResult.Value\x12?\n\x0bconnections\x18\x03 \x03(\x0b2*.edgrpc.compiler.CompilerResult.Connection\x1aO\n\x05Value\x12"\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12"\n\x05value\x18\x02 \x01(\x0b2\x13.edgir.lit.ValueLit\x1a_\n\nConnection\x12(\n\nblock_port\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12\'\n\tlink_port\x18\x02 \x01(\x0b2\x14.edgir.ref.LocalPathb\x06proto3') + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n\x15edgrpc/compiler.proto\x12\x0fedgrpc.compiler\x1a\x12edgir/schema.proto\x1a\x0fedgir/ref.proto\x1a\x0fedgir/lit.proto\x1a\x10edgrpc/hdl.proto"^\n\x0bErrorRecord\x12"\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12\x0c\n\x04kind\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x0f\n\x07details\x18\x04 \x01(\t"e\n\x0fCompilerRequest\x12$\n\x06design\x18\x02 \x01(\x0b2\x14.edgir.schema.Design\x12,\n\x0brefinements\x18\x03 \x01(\x0b2\x17.edgrpc.hdl.Refinements"\x94\x03\n\x0eCompilerResult\x12$\n\x06design\x18\x01 \x01(\x0b2\x14.edgir.schema.Design\x12,\n\x06errors\x18\x04 \x03(\x0b2\x1c.edgrpc.compiler.ErrorRecord\x12;\n\x0csolvedValues\x18\x02 \x03(\x0b2%.edgrpc.compiler.CompilerResult.Value\x12?\n\x0bconnections\x18\x03 \x03(\x0b2*.edgrpc.compiler.CompilerResult.Connection\x1aO\n\x05Value\x12"\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12"\n\x05value\x18\x02 \x01(\x0b2\x13.edgir.lit.ValueLit\x1a_\n\nConnection\x12(\n\nblock_port\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12\'\n\tlink_port\x18\x02 \x01(\x0b2\x14.edgir.ref.LocalPathb\x06proto3' +) _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'edgrpc.compiler_pb2', globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "edgrpc.compiler_pb2", globals()) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None _ERRORRECORD._serialized_start = 114 @@ -22,4 +27,4 @@ _COMPILERRESULT_VALUE._serialized_start = 542 _COMPILERRESULT_VALUE._serialized_end = 621 _COMPILERRESULT_CONNECTION._serialized_start = 623 - _COMPILERRESULT_CONNECTION._serialized_end = 718 \ No newline at end of file + _COMPILERRESULT_CONNECTION._serialized_end = 718 diff --git a/edg/edgrpc/compiler_pb2.pyi b/edg/edgrpc/compiler_pb2.pyi index 4937795ad..625fc3b1e 100644 --- a/edg/edgrpc/compiler_pb2.pyi +++ b/edg/edgrpc/compiler_pb2.pyi @@ -6,6 +6,7 @@ Interface to the HDL (eg, library fetch) is not included here. This no longer uses gRPC to avoid complexity of sockets. """ + from collections import abc as _abc from edgir import lit_pb2 as _lit_pb2 from edgir import ref_pb2 as _ref_pb2 @@ -17,6 +18,7 @@ from google.protobuf.internal import containers as _containers import builtins as _builtins import sys import typing as _typing + if sys.version_info >= (3, 10): from typing import TypeAlias as _TypeAlias else: @@ -31,26 +33,33 @@ class ErrorRecord(_message.Message): NAME_FIELD_NUMBER: _builtins.int DETAILS_FIELD_NUMBER: _builtins.int kind: _builtins.str - 'kind of error, eg failed to generate' + "kind of error, eg failed to generate" name: _builtins.str - 'constraint name / short description' + "constraint name / short description" details: _builtins.str - 'longer description, optional' + "longer description, optional" @_builtins.property def path(self) -> _ref_pb2.LocalPath: """link / block / port, cannot be the constraint""" - def __init__(self, *, path: _ref_pb2.LocalPath | None=..., kind: _builtins.str=..., name: _builtins.str=..., details: _builtins.str=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['path', b'path'] + def __init__( + self, + *, + path: _ref_pb2.LocalPath | None = ..., + kind: _builtins.str = ..., + name: _builtins.str = ..., + details: _builtins.str = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["path", b"path"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['details', b'details', 'kind', b'kind', 'name', b'name', 'path', b'path'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "details", b"details", "kind", b"kind", "name", b"name", "path", b"path" + ] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___ErrorRecord: _TypeAlias = ErrorRecord @_typing.final @@ -60,23 +69,19 @@ class CompilerRequest(_message.Message): REFINEMENTS_FIELD_NUMBER: _builtins.int @_builtins.property - def design(self) -> _schema_pb2.Design: - ... - + def design(self) -> _schema_pb2.Design: ... @_builtins.property - def refinements(self) -> _hdl_pb2.Refinements: - ... + def refinements(self) -> _hdl_pb2.Refinements: ... + def __init__( + self, *, design: _schema_pb2.Design | None = ..., refinements: _hdl_pb2.Refinements | None = ... + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["design", b"design", "refinements", b"refinements"] - def __init__(self, *, design: _schema_pb2.Design | None=..., refinements: _hdl_pb2.Refinements | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['design', b'design', 'refinements', b'refinements'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["design", b"design", "refinements", b"refinements"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['design', b'design', 'refinements', b'refinements'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___CompilerRequest: _TypeAlias = CompilerRequest @_typing.final @@ -90,78 +95,67 @@ class CompilerResult(_message.Message): VALUE_FIELD_NUMBER: _builtins.int @_builtins.property - def path(self) -> _ref_pb2.LocalPath: - ... - + def path(self) -> _ref_pb2.LocalPath: ... @_builtins.property - def value(self) -> _lit_pb2.ValueLit: - ... - - def __init__(self, *, path: _ref_pb2.LocalPath | None=..., value: _lit_pb2.ValueLit | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['path', b'path', 'value', b'value'] + def value(self) -> _lit_pb2.ValueLit: ... + def __init__(self, *, path: _ref_pb2.LocalPath | None = ..., value: _lit_pb2.ValueLit | None = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["path", b"path", "value", b"value"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['path', b'path', 'value', b'value'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["path", b"path", "value", b"value"] - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... @_typing.final class Connection(_message.Message): """from block ports to fully resolved (bypassing exports) links, including inner ports""" + DESCRIPTOR: _descriptor.Descriptor BLOCK_PORT_FIELD_NUMBER: _builtins.int LINK_PORT_FIELD_NUMBER: _builtins.int @_builtins.property - def block_port(self) -> _ref_pb2.LocalPath: - ... - + def block_port(self) -> _ref_pb2.LocalPath: ... @_builtins.property - def link_port(self) -> _ref_pb2.LocalPath: - ... + def link_port(self) -> _ref_pb2.LocalPath: ... + def __init__( + self, *, block_port: _ref_pb2.LocalPath | None = ..., link_port: _ref_pb2.LocalPath | None = ... + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["block_port", b"block_port", "link_port", b"link_port"] - def __init__(self, *, block_port: _ref_pb2.LocalPath | None=..., link_port: _ref_pb2.LocalPath | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['block_port', b'block_port', 'link_port', b'link_port'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["block_port", b"block_port", "link_port", b"link_port"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['block_port', b'block_port', 'link_port', b'link_port'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... DESIGN_FIELD_NUMBER: _builtins.int ERRORS_FIELD_NUMBER: _builtins.int SOLVEDVALUES_FIELD_NUMBER: _builtins.int CONNECTIONS_FIELD_NUMBER: _builtins.int @_builtins.property - def design(self) -> _schema_pb2.Design: - ... - + def design(self) -> _schema_pb2.Design: ... @_builtins.property - def errors(self) -> _containers.RepeatedCompositeFieldContainer[Global___ErrorRecord]: - ... - + def errors(self) -> _containers.RepeatedCompositeFieldContainer[Global___ErrorRecord]: ... @_builtins.property - def solvedValues(self) -> _containers.RepeatedCompositeFieldContainer[Global___CompilerResult.Value]: - ... - + def solvedValues(self) -> _containers.RepeatedCompositeFieldContainer[Global___CompilerResult.Value]: ... @_builtins.property - def connections(self) -> _containers.RepeatedCompositeFieldContainer[Global___CompilerResult.Connection]: - ... - - def __init__(self, *, design: _schema_pb2.Design | None=..., errors: _abc.Iterable[Global___ErrorRecord] | None=..., solvedValues: _abc.Iterable[Global___CompilerResult.Value] | None=..., connections: _abc.Iterable[Global___CompilerResult.Connection] | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['design', b'design'] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['connections', b'connections', 'design', b'design', 'errors', b'errors', 'solvedValues', b'solvedValues'] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... -Global___CompilerResult: _TypeAlias = CompilerResult \ No newline at end of file + def connections(self) -> _containers.RepeatedCompositeFieldContainer[Global___CompilerResult.Connection]: ... + def __init__( + self, + *, + design: _schema_pb2.Design | None = ..., + errors: _abc.Iterable[Global___ErrorRecord] | None = ..., + solvedValues: _abc.Iterable[Global___CompilerResult.Value] | None = ..., + connections: _abc.Iterable[Global___CompilerResult.Connection] | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["design", b"design"] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "connections", b"connections", "design", b"design", "errors", b"errors", "solvedValues", b"solvedValues" + ] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___CompilerResult: _TypeAlias = CompilerResult diff --git a/edg/edgrpc/hdl_pb2.py b/edg/edgrpc/hdl_pb2.py index 499d3c6e4..97b2a4a65 100644 --- a/edg/edgrpc/hdl_pb2.py +++ b/edg/edgrpc/hdl_pb2.py @@ -1,20 +1,25 @@ """Generated protocol buffer code.""" + from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database + _sym_db = _symbol_database.Default() from ..edgir import schema_pb2 as edgir_dot_schema__pb2 from ..edgir import ref_pb2 as edgir_dot_ref__pb2 from ..edgir import elem_pb2 as edgir_dot_elem__pb2 from ..edgir import lit_pb2 as edgir_dot_lit__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10edgrpc/hdl.proto\x12\nedgrpc.hdl\x1a\x12edgir/schema.proto\x1a\x0fedgir/ref.proto\x1a\x10edgir/elem.proto\x1a\x0fedgir/lit.proto"\xb6\x04\n\x0bRefinements\x124\n\nsubclasses\x18\x01 \x03(\x0b2 .edgrpc.hdl.Refinements.Subclass\x12-\n\x06values\x18\x02 \x03(\x0b2\x1d.edgrpc.hdl.Refinements.Value\x1a\x8e\x01\n\x08Subclass\x12$\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPathH\x00\x12%\n\x03cls\x18\x02 \x01(\x0b2\x16.edgir.ref.LibraryPathH\x00\x12+\n\x0breplacement\x18\x03 \x01(\x0b2\x16.edgir.ref.LibraryPathB\x08\n\x06source\x1a\xb0\x02\n\x05Value\x12$\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPathH\x00\x12A\n\tcls_param\x18\x02 \x01(\x0b2,.edgrpc.hdl.Refinements.Value.ClassParamPathH\x00\x12#\n\x04expr\x18\x03 \x01(\x0b2\x13.edgir.lit.ValueLitH\x01\x12%\n\x05param\x18\x04 \x01(\x0b2\x14.edgir.ref.LocalPathH\x01\x1a_\n\x0eClassParamPath\x12#\n\x03cls\x18\x01 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12(\n\nparam_path\x18\x02 \x01(\x0b2\x14.edgir.ref.LocalPathB\x08\n\x06sourceB\x07\n\x05value"\x1a\n\nModuleName\x12\x0c\n\x04name\x18\x01 \x01(\t"8\n\rIndexResponse\x12\'\n\x07indexed\x18\x01 \x03(\x0b2\x16.edgir.ref.LibraryPath"9\n\x0eLibraryRequest\x12\'\n\x07element\x18\x02 \x01(\x0b2\x16.edgir.ref.LibraryPath"n\n\x0fLibraryResponse\x12-\n\x07element\x18\x01 \x01(\x0b2\x1c.edgir.schema.Library.NS.Val\x12,\n\x0brefinements\x18\x03 \x01(\x0b2\x17.edgrpc.hdl.Refinements"S\n\tExprValue\x12"\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12"\n\x05value\x18\x02 \x01(\x0b2\x13.edgir.lit.ValueLit"b\n\x10GeneratorRequest\x12\'\n\x07element\x18\x02 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12%\n\x06values\x18\x04 \x03(\x0b2\x15.edgrpc.hdl.ExprValue"B\n\x11GeneratorResponse\x12-\n\tgenerated\x18\x01 \x01(\x0b2\x1a.edgir.elem.HierarchyBlock"\x97\x01\n\x11RefinementRequest\x12/\n\x0frefinement_pass\x18\x01 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12$\n\x06design\x18\x02 \x01(\x0b2\x14.edgir.schema.Design\x12+\n\x0csolvedValues\x18\x03 \x03(\x0b2\x15.edgrpc.hdl.ExprValue">\n\x12RefinementResponse\x12(\n\tnewValues\x18\x01 \x03(\x0b2\x15.edgrpc.hdl.ExprValue"\xfc\x01\n\x0eBackendRequest\x12\'\n\x07backend\x18\x01 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12$\n\x06design\x18\x02 \x01(\x0b2\x14.edgir.schema.Design\x12+\n\x0csolvedValues\x18\x03 \x03(\x0b2\x15.edgrpc.hdl.ExprValue\x12<\n\targuments\x18\x04 \x03(\x0b2).edgrpc.hdl.BackendRequest.ArgumentsEntry\x1a0\n\x0eArgumentsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x028\x01"\x8e\x01\n\x0fBackendResponse\x123\n\x07results\x18\x01 \x03(\x0b2".edgrpc.hdl.BackendResponse.Result\x1aF\n\x06Result\x12"\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12\x0e\n\x04text\x18\x02 \x01(\tH\x00B\x08\n\x06result"1\n\rErrorResponse\x12\r\n\x05error\x18\x01 \x01(\t\x12\x11\n\ttraceback\x18\x02 \x01(\t"\xc8\x02\n\nHdlRequest\x12.\n\x0cindex_module\x18\x01 \x01(\x0b2\x16.edgrpc.hdl.ModuleNameH\x00\x129\n\x13get_library_element\x18\x02 \x01(\x0b2\x1a.edgrpc.hdl.LibraryRequestH\x00\x12;\n\x13elaborate_generator\x18\x03 \x01(\x0b2\x1c.edgrpc.hdl.GeneratorRequestH\x00\x127\n\x0erun_refinement\x18\x05 \x01(\x0b2\x1d.edgrpc.hdl.RefinementRequestH\x00\x121\n\x0brun_backend\x18\x04 \x01(\x0b2\x1a.edgrpc.hdl.BackendRequestH\x00\x12\x1b\n\x11get_proto_version\x18Z \x01(\rH\x00B\t\n\x07request"\xfd\x02\n\x0bHdlResponse\x121\n\x0cindex_module\x18\x01 \x01(\x0b2\x19.edgrpc.hdl.IndexResponseH\x00\x12:\n\x13get_library_element\x18\x02 \x01(\x0b2\x1b.edgrpc.hdl.LibraryResponseH\x00\x12<\n\x13elaborate_generator\x18\x03 \x01(\x0b2\x1d.edgrpc.hdl.GeneratorResponseH\x00\x128\n\x0erun_refinement\x18\x05 \x01(\x0b2\x1e.edgrpc.hdl.RefinementResponseH\x00\x122\n\x0brun_backend\x18\x04 \x01(\x0b2\x1b.edgrpc.hdl.BackendResponseH\x00\x12\x1b\n\x11get_proto_version\x18Z \x01(\rH\x00\x12*\n\x05error\x18c \x01(\x0b2\x19.edgrpc.hdl.ErrorResponseH\x00B\n\n\x08responseb\x06proto3') + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n\x10edgrpc/hdl.proto\x12\nedgrpc.hdl\x1a\x12edgir/schema.proto\x1a\x0fedgir/ref.proto\x1a\x10edgir/elem.proto\x1a\x0fedgir/lit.proto"\xb6\x04\n\x0bRefinements\x124\n\nsubclasses\x18\x01 \x03(\x0b2 .edgrpc.hdl.Refinements.Subclass\x12-\n\x06values\x18\x02 \x03(\x0b2\x1d.edgrpc.hdl.Refinements.Value\x1a\x8e\x01\n\x08Subclass\x12$\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPathH\x00\x12%\n\x03cls\x18\x02 \x01(\x0b2\x16.edgir.ref.LibraryPathH\x00\x12+\n\x0breplacement\x18\x03 \x01(\x0b2\x16.edgir.ref.LibraryPathB\x08\n\x06source\x1a\xb0\x02\n\x05Value\x12$\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPathH\x00\x12A\n\tcls_param\x18\x02 \x01(\x0b2,.edgrpc.hdl.Refinements.Value.ClassParamPathH\x00\x12#\n\x04expr\x18\x03 \x01(\x0b2\x13.edgir.lit.ValueLitH\x01\x12%\n\x05param\x18\x04 \x01(\x0b2\x14.edgir.ref.LocalPathH\x01\x1a_\n\x0eClassParamPath\x12#\n\x03cls\x18\x01 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12(\n\nparam_path\x18\x02 \x01(\x0b2\x14.edgir.ref.LocalPathB\x08\n\x06sourceB\x07\n\x05value"\x1a\n\nModuleName\x12\x0c\n\x04name\x18\x01 \x01(\t"8\n\rIndexResponse\x12\'\n\x07indexed\x18\x01 \x03(\x0b2\x16.edgir.ref.LibraryPath"9\n\x0eLibraryRequest\x12\'\n\x07element\x18\x02 \x01(\x0b2\x16.edgir.ref.LibraryPath"n\n\x0fLibraryResponse\x12-\n\x07element\x18\x01 \x01(\x0b2\x1c.edgir.schema.Library.NS.Val\x12,\n\x0brefinements\x18\x03 \x01(\x0b2\x17.edgrpc.hdl.Refinements"S\n\tExprValue\x12"\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12"\n\x05value\x18\x02 \x01(\x0b2\x13.edgir.lit.ValueLit"b\n\x10GeneratorRequest\x12\'\n\x07element\x18\x02 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12%\n\x06values\x18\x04 \x03(\x0b2\x15.edgrpc.hdl.ExprValue"B\n\x11GeneratorResponse\x12-\n\tgenerated\x18\x01 \x01(\x0b2\x1a.edgir.elem.HierarchyBlock"\x97\x01\n\x11RefinementRequest\x12/\n\x0frefinement_pass\x18\x01 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12$\n\x06design\x18\x02 \x01(\x0b2\x14.edgir.schema.Design\x12+\n\x0csolvedValues\x18\x03 \x03(\x0b2\x15.edgrpc.hdl.ExprValue">\n\x12RefinementResponse\x12(\n\tnewValues\x18\x01 \x03(\x0b2\x15.edgrpc.hdl.ExprValue"\xfc\x01\n\x0eBackendRequest\x12\'\n\x07backend\x18\x01 \x01(\x0b2\x16.edgir.ref.LibraryPath\x12$\n\x06design\x18\x02 \x01(\x0b2\x14.edgir.schema.Design\x12+\n\x0csolvedValues\x18\x03 \x03(\x0b2\x15.edgrpc.hdl.ExprValue\x12<\n\targuments\x18\x04 \x03(\x0b2).edgrpc.hdl.BackendRequest.ArgumentsEntry\x1a0\n\x0eArgumentsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x028\x01"\x8e\x01\n\x0fBackendResponse\x123\n\x07results\x18\x01 \x03(\x0b2".edgrpc.hdl.BackendResponse.Result\x1aF\n\x06Result\x12"\n\x04path\x18\x01 \x01(\x0b2\x14.edgir.ref.LocalPath\x12\x0e\n\x04text\x18\x02 \x01(\tH\x00B\x08\n\x06result"1\n\rErrorResponse\x12\r\n\x05error\x18\x01 \x01(\t\x12\x11\n\ttraceback\x18\x02 \x01(\t"\xc8\x02\n\nHdlRequest\x12.\n\x0cindex_module\x18\x01 \x01(\x0b2\x16.edgrpc.hdl.ModuleNameH\x00\x129\n\x13get_library_element\x18\x02 \x01(\x0b2\x1a.edgrpc.hdl.LibraryRequestH\x00\x12;\n\x13elaborate_generator\x18\x03 \x01(\x0b2\x1c.edgrpc.hdl.GeneratorRequestH\x00\x127\n\x0erun_refinement\x18\x05 \x01(\x0b2\x1d.edgrpc.hdl.RefinementRequestH\x00\x121\n\x0brun_backend\x18\x04 \x01(\x0b2\x1a.edgrpc.hdl.BackendRequestH\x00\x12\x1b\n\x11get_proto_version\x18Z \x01(\rH\x00B\t\n\x07request"\xfd\x02\n\x0bHdlResponse\x121\n\x0cindex_module\x18\x01 \x01(\x0b2\x19.edgrpc.hdl.IndexResponseH\x00\x12:\n\x13get_library_element\x18\x02 \x01(\x0b2\x1b.edgrpc.hdl.LibraryResponseH\x00\x12<\n\x13elaborate_generator\x18\x03 \x01(\x0b2\x1d.edgrpc.hdl.GeneratorResponseH\x00\x128\n\x0erun_refinement\x18\x05 \x01(\x0b2\x1e.edgrpc.hdl.RefinementResponseH\x00\x122\n\x0brun_backend\x18\x04 \x01(\x0b2\x1b.edgrpc.hdl.BackendResponseH\x00\x12\x1b\n\x11get_proto_version\x18Z \x01(\rH\x00\x12*\n\x05error\x18c \x01(\x0b2\x19.edgrpc.hdl.ErrorResponseH\x00B\n\n\x08responseb\x06proto3' +) _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'edgrpc.hdl_pb2', globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "edgrpc.hdl_pb2", globals()) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None _BACKENDREQUEST_ARGUMENTSENTRY._options = None - _BACKENDREQUEST_ARGUMENTSENTRY._serialized_options = b'8\x01' + _BACKENDREQUEST_ARGUMENTSENTRY._serialized_options = b"8\x01" _REFINEMENTS._serialized_start = 105 _REFINEMENTS._serialized_end = 671 _REFINEMENTS_SUBCLASS._serialized_start = 222 @@ -54,4 +59,4 @@ _HDLREQUEST._serialized_start = 1853 _HDLREQUEST._serialized_end = 2181 _HDLRESPONSE._serialized_start = 2184 - _HDLRESPONSE._serialized_end = 2565 \ No newline at end of file + _HDLRESPONSE._serialized_end = 2565 diff --git a/edg/edgrpc/hdl_pb2.pyi b/edg/edgrpc/hdl_pb2.pyi index 14ede7317..6f22f752f 100644 --- a/edg/edgrpc/hdl_pb2.pyi +++ b/edg/edgrpc/hdl_pb2.pyi @@ -4,6 +4,7 @@ isort:skip_file * Defines messages for a service provided in Python that exposes HDL-to-edgir elaboration for a compiler in a different process / language. """ + from collections import abc as _abc from edgir import elem_pb2 as _elem_pb2 from edgir import lit_pb2 as _lit_pb2 @@ -15,6 +16,7 @@ from google.protobuf.internal import containers as _containers import builtins as _builtins import sys import typing as _typing + if sys.version_info >= (3, 10): from typing import TypeAlias as _TypeAlias else: @@ -33,32 +35,32 @@ class Refinements(_message.Message): REPLACEMENT_FIELD_NUMBER: _builtins.int @_builtins.property - def path(self) -> _ref_pb2.LocalPath: - ... - + def path(self) -> _ref_pb2.LocalPath: ... @_builtins.property - def cls(self) -> _ref_pb2.LibraryPath: - ... - + def cls(self) -> _ref_pb2.LibraryPath: ... @_builtins.property - def replacement(self) -> _ref_pb2.LibraryPath: - ... - - def __init__(self, *, path: _ref_pb2.LocalPath | None=..., cls: _ref_pb2.LibraryPath | None=..., replacement: _ref_pb2.LibraryPath | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['cls', b'cls', 'path', b'path', 'replacement', b'replacement', 'source', b'source'] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['cls', b'cls', 'path', b'path', 'replacement', b'replacement', 'source', b'source'] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... - _WhichOneofReturnType_source: _TypeAlias = _typing.Literal['path', 'cls'] - _WhichOneofArgType_source: _TypeAlias = _typing.Literal['source', b'source'] - - def WhichOneof(self, oneof_group: _WhichOneofArgType_source) -> _WhichOneofReturnType_source | None: - ... + def replacement(self) -> _ref_pb2.LibraryPath: ... + def __init__( + self, + *, + path: _ref_pb2.LocalPath | None = ..., + cls: _ref_pb2.LibraryPath | None = ..., + replacement: _ref_pb2.LibraryPath | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal[ + "cls", b"cls", "path", b"path", "replacement", b"replacement", "source", b"source" + ] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "cls", b"cls", "path", b"path", "replacement", b"replacement", "source", b"source" + ] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_source: _TypeAlias = _typing.Literal["path", "cls"] + _WhichOneofArgType_source: _TypeAlias = _typing.Literal["source", b"source"] + + def WhichOneof(self, oneof_group: _WhichOneofArgType_source) -> _WhichOneofReturnType_source | None: ... @_typing.final class Value(_message.Message): @@ -71,36 +73,28 @@ class Refinements(_message.Message): PARAM_PATH_FIELD_NUMBER: _builtins.int @_builtins.property - def cls(self) -> _ref_pb2.LibraryPath: - ... - + def cls(self) -> _ref_pb2.LibraryPath: ... @_builtins.property - def param_path(self) -> _ref_pb2.LocalPath: - ... + def param_path(self) -> _ref_pb2.LocalPath: ... + def __init__( + self, *, cls: _ref_pb2.LibraryPath | None = ..., param_path: _ref_pb2.LocalPath | None = ... + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["cls", b"cls", "param_path", b"param_path"] - def __init__(self, *, cls: _ref_pb2.LibraryPath | None=..., param_path: _ref_pb2.LocalPath | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['cls', b'cls', 'param_path', b'param_path'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["cls", b"cls", "param_path", b"param_path"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['cls', b'cls', 'param_path', b'param_path'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... PATH_FIELD_NUMBER: _builtins.int CLS_PARAM_FIELD_NUMBER: _builtins.int EXPR_FIELD_NUMBER: _builtins.int PARAM_FIELD_NUMBER: _builtins.int @_builtins.property - def path(self) -> _ref_pb2.LocalPath: - ... - + def path(self) -> _ref_pb2.LocalPath: ... @_builtins.property - def cls_param(self) -> Global___Refinements.Value.ClassParamPath: - ... - + def cls_param(self) -> Global___Refinements.Value.ClassParamPath: ... @_builtins.property def expr(self) -> _lit_pb2.ValueLit: """set to a specific value""" @@ -109,45 +103,73 @@ class Refinements(_message.Message): def param(self) -> _ref_pb2.LocalPath: """set to a value of another parameter - invalid for classes for now""" - def __init__(self, *, path: _ref_pb2.LocalPath | None=..., cls_param: Global___Refinements.Value.ClassParamPath | None=..., expr: _lit_pb2.ValueLit | None=..., param: _ref_pb2.LocalPath | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['cls_param', b'cls_param', 'expr', b'expr', 'param', b'param', 'path', b'path', 'source', b'source', 'value', b'value'] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['cls_param', b'cls_param', 'expr', b'expr', 'param', b'param', 'path', b'path', 'source', b'source', 'value', b'value'] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... - _WhichOneofReturnType_source: _TypeAlias = _typing.Literal['path', 'cls_param'] - _WhichOneofArgType_source: _TypeAlias = _typing.Literal['source', b'source'] - _WhichOneofReturnType_value: _TypeAlias = _typing.Literal['expr', 'param'] - _WhichOneofArgType_value: _TypeAlias = _typing.Literal['value', b'value'] + def __init__( + self, + *, + path: _ref_pb2.LocalPath | None = ..., + cls_param: Global___Refinements.Value.ClassParamPath | None = ..., + expr: _lit_pb2.ValueLit | None = ..., + param: _ref_pb2.LocalPath | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal[ + "cls_param", + b"cls_param", + "expr", + b"expr", + "param", + b"param", + "path", + b"path", + "source", + b"source", + "value", + b"value", + ] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "cls_param", + b"cls_param", + "expr", + b"expr", + "param", + b"param", + "path", + b"path", + "source", + b"source", + "value", + b"value", + ] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_source: _TypeAlias = _typing.Literal["path", "cls_param"] + _WhichOneofArgType_source: _TypeAlias = _typing.Literal["source", b"source"] + _WhichOneofReturnType_value: _TypeAlias = _typing.Literal["expr", "param"] + _WhichOneofArgType_value: _TypeAlias = _typing.Literal["value", b"value"] @_typing.overload - def WhichOneof(self, oneof_group: _WhichOneofArgType_source) -> _WhichOneofReturnType_source | None: - ... - + def WhichOneof(self, oneof_group: _WhichOneofArgType_source) -> _WhichOneofReturnType_source | None: ... @_typing.overload - def WhichOneof(self, oneof_group: _WhichOneofArgType_value) -> _WhichOneofReturnType_value | None: - ... + def WhichOneof(self, oneof_group: _WhichOneofArgType_value) -> _WhichOneofReturnType_value | None: ... + SUBCLASSES_FIELD_NUMBER: _builtins.int VALUES_FIELD_NUMBER: _builtins.int @_builtins.property - def subclasses(self) -> _containers.RepeatedCompositeFieldContainer[Global___Refinements.Subclass]: - ... - + def subclasses(self) -> _containers.RepeatedCompositeFieldContainer[Global___Refinements.Subclass]: ... @_builtins.property - def values(self) -> _containers.RepeatedCompositeFieldContainer[Global___Refinements.Value]: - ... + def values(self) -> _containers.RepeatedCompositeFieldContainer[Global___Refinements.Value]: ... + def __init__( + self, + *, + subclasses: _abc.Iterable[Global___Refinements.Subclass] | None = ..., + values: _abc.Iterable[Global___Refinements.Value] | None = ..., + ) -> None: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["subclasses", b"subclasses", "values", b"values"] - def __init__(self, *, subclasses: _abc.Iterable[Global___Refinements.Subclass] | None=..., values: _abc.Iterable[Global___Refinements.Value] | None=...) -> None: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['subclasses', b'subclasses', 'values', b'values'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___Refinements: _TypeAlias = Refinements @_typing.final @@ -156,12 +178,11 @@ class ModuleName(_message.Message): NAME_FIELD_NUMBER: _builtins.int name: _builtins.str - def __init__(self, *, name: _builtins.str=...) -> None: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['name', b'name'] + def __init__(self, *, name: _builtins.str = ...) -> None: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["name", b"name"] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___ModuleName: _TypeAlias = ModuleName @_typing.final @@ -170,15 +191,12 @@ class IndexResponse(_message.Message): INDEXED_FIELD_NUMBER: _builtins.int @_builtins.property - def indexed(self) -> _containers.RepeatedCompositeFieldContainer[_ref_pb2.LibraryPath]: - ... + def indexed(self) -> _containers.RepeatedCompositeFieldContainer[_ref_pb2.LibraryPath]: ... + def __init__(self, *, indexed: _abc.Iterable[_ref_pb2.LibraryPath] | None = ...) -> None: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["indexed", b"indexed"] - def __init__(self, *, indexed: _abc.Iterable[_ref_pb2.LibraryPath] | None=...) -> None: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['indexed', b'indexed'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___IndexResponse: _TypeAlias = IndexResponse @_typing.final @@ -190,16 +208,14 @@ class LibraryRequest(_message.Message): def element(self) -> _ref_pb2.LibraryPath: """library element asked for""" - def __init__(self, *, element: _ref_pb2.LibraryPath | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['element', b'element'] + def __init__(self, *, element: _ref_pb2.LibraryPath | None = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["element", b"element"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['element', b'element'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["element", b"element"] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___LibraryRequest: _TypeAlias = LibraryRequest @_typing.final @@ -209,23 +225,21 @@ class LibraryResponse(_message.Message): REFINEMENTS_FIELD_NUMBER: _builtins.int @_builtins.property - def element(self) -> _schema_pb2.Library.NS.Val: - ... - + def element(self) -> _schema_pb2.Library.NS.Val: ... @_builtins.property def refinements(self) -> Global___Refinements: """only valid if element is a top-level block""" - def __init__(self, *, element: _schema_pb2.Library.NS.Val | None=..., refinements: Global___Refinements | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['element', b'element', 'refinements', b'refinements'] + def __init__( + self, *, element: _schema_pb2.Library.NS.Val | None = ..., refinements: Global___Refinements | None = ... + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["element", b"element", "refinements", b"refinements"] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["element", b"element", "refinements", b"refinements"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['element', b'element', 'refinements', b'refinements'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___LibraryResponse: _TypeAlias = LibraryResponse @_typing.final @@ -235,23 +249,17 @@ class ExprValue(_message.Message): VALUE_FIELD_NUMBER: _builtins.int @_builtins.property - def path(self) -> _ref_pb2.LocalPath: - ... - + def path(self) -> _ref_pb2.LocalPath: ... @_builtins.property - def value(self) -> _lit_pb2.ValueLit: - ... + def value(self) -> _lit_pb2.ValueLit: ... + def __init__(self, *, path: _ref_pb2.LocalPath | None = ..., value: _lit_pb2.ValueLit | None = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["path", b"path", "value", b"value"] - def __init__(self, *, path: _ref_pb2.LocalPath | None=..., value: _lit_pb2.ValueLit | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['path', b'path', 'value', b'value'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["path", b"path", "value", b"value"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['path', b'path', 'value', b'value'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___ExprValue: _TypeAlias = ExprValue @_typing.final @@ -265,19 +273,17 @@ class GeneratorRequest(_message.Message): """path of library element containing the generator""" @_builtins.property - def values(self) -> _containers.RepeatedCompositeFieldContainer[Global___ExprValue]: - ... + def values(self) -> _containers.RepeatedCompositeFieldContainer[Global___ExprValue]: ... + def __init__( + self, *, element: _ref_pb2.LibraryPath | None = ..., values: _abc.Iterable[Global___ExprValue] | None = ... + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["element", b"element"] - def __init__(self, *, element: _ref_pb2.LibraryPath | None=..., values: _abc.Iterable[Global___ExprValue] | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['element', b'element'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["element", b"element", "values", b"values"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['element', b'element', 'values', b'values'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___GeneratorRequest: _TypeAlias = GeneratorRequest @_typing.final @@ -286,19 +292,15 @@ class GeneratorResponse(_message.Message): GENERATED_FIELD_NUMBER: _builtins.int @_builtins.property - def generated(self) -> _elem_pb2.HierarchyBlock: - ... + def generated(self) -> _elem_pb2.HierarchyBlock: ... + def __init__(self, *, generated: _elem_pb2.HierarchyBlock | None = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["generated", b"generated"] - def __init__(self, *, generated: _elem_pb2.HierarchyBlock | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['generated', b'generated'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["generated", b"generated"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['generated', b'generated'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___GeneratorResponse: _TypeAlias = GeneratorResponse @_typing.final @@ -306,33 +308,34 @@ class RefinementRequest(_message.Message): """Runs a refinement pass - something that takes a full design and solved values and generates additional values, eg for refdes assignment """ + DESCRIPTOR: _descriptor.Descriptor REFINEMENT_PASS_FIELD_NUMBER: _builtins.int DESIGN_FIELD_NUMBER: _builtins.int SOLVEDVALUES_FIELD_NUMBER: _builtins.int @_builtins.property - def refinement_pass(self) -> _ref_pb2.LibraryPath: - ... - + def refinement_pass(self) -> _ref_pb2.LibraryPath: ... @_builtins.property - def design(self) -> _schema_pb2.Design: - ... - + def design(self) -> _schema_pb2.Design: ... @_builtins.property - def solvedValues(self) -> _containers.RepeatedCompositeFieldContainer[Global___ExprValue]: - ... - - def __init__(self, *, refinement_pass: _ref_pb2.LibraryPath | None=..., design: _schema_pb2.Design | None=..., solvedValues: _abc.Iterable[Global___ExprValue] | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['design', b'design', 'refinement_pass', b'refinement_pass'] + def solvedValues(self) -> _containers.RepeatedCompositeFieldContainer[Global___ExprValue]: ... + def __init__( + self, + *, + refinement_pass: _ref_pb2.LibraryPath | None = ..., + design: _schema_pb2.Design | None = ..., + solvedValues: _abc.Iterable[Global___ExprValue] | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["design", b"design", "refinement_pass", b"refinement_pass"] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "design", b"design", "refinement_pass", b"refinement_pass", "solvedValues", b"solvedValues" + ] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['design', b'design', 'refinement_pass', b'refinement_pass', 'solvedValues', b'solvedValues'] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___RefinementRequest: _TypeAlias = RefinementRequest @_typing.final @@ -341,15 +344,12 @@ class RefinementResponse(_message.Message): NEWVALUES_FIELD_NUMBER: _builtins.int @_builtins.property - def newValues(self) -> _containers.RepeatedCompositeFieldContainer[Global___ExprValue]: - ... + def newValues(self) -> _containers.RepeatedCompositeFieldContainer[Global___ExprValue]: ... + def __init__(self, *, newValues: _abc.Iterable[Global___ExprValue] | None = ...) -> None: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["newValues", b"newValues"] - def __init__(self, *, newValues: _abc.Iterable[Global___ExprValue] | None=...) -> None: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['newValues', b'newValues'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___RefinementResponse: _TypeAlias = RefinementResponse @_typing.final @@ -357,6 +357,7 @@ class BackendRequest(_message.Message): """Runs a backend - something that generates fabrication artifacts from a compiled design tree eg, generate KiCad netlist, or generate microcontroller firmware pinmap headers """ + DESCRIPTOR: _descriptor.Descriptor @_typing.final @@ -367,43 +368,41 @@ class BackendRequest(_message.Message): key: _builtins.str value: _builtins.str - def __init__(self, *, key: _builtins.str=..., value: _builtins.str=...) -> None: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['key', b'key', 'value', b'value'] + def __init__(self, *, key: _builtins.str = ..., value: _builtins.str = ...) -> None: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["key", b"key", "value", b"value"] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... BACKEND_FIELD_NUMBER: _builtins.int DESIGN_FIELD_NUMBER: _builtins.int SOLVEDVALUES_FIELD_NUMBER: _builtins.int ARGUMENTS_FIELD_NUMBER: _builtins.int @_builtins.property - def backend(self) -> _ref_pb2.LibraryPath: - ... - + def backend(self) -> _ref_pb2.LibraryPath: ... @_builtins.property - def design(self) -> _schema_pb2.Design: - ... - + def design(self) -> _schema_pb2.Design: ... @_builtins.property - def solvedValues(self) -> _containers.RepeatedCompositeFieldContainer[Global___ExprValue]: - ... - + def solvedValues(self) -> _containers.RepeatedCompositeFieldContainer[Global___ExprValue]: ... @_builtins.property - def arguments(self) -> _containers.ScalarMap[_builtins.str, _builtins.str]: - ... - - def __init__(self, *, backend: _ref_pb2.LibraryPath | None=..., design: _schema_pb2.Design | None=..., solvedValues: _abc.Iterable[Global___ExprValue] | None=..., arguments: _abc.Mapping[_builtins.str, _builtins.str] | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['backend', b'backend', 'design', b'design'] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['arguments', b'arguments', 'backend', b'backend', 'design', b'design', 'solvedValues', b'solvedValues'] + def arguments(self) -> _containers.ScalarMap[_builtins.str, _builtins.str]: ... + def __init__( + self, + *, + backend: _ref_pb2.LibraryPath | None = ..., + design: _schema_pb2.Design | None = ..., + solvedValues: _abc.Iterable[Global___ExprValue] | None = ..., + arguments: _abc.Mapping[_builtins.str, _builtins.str] | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["backend", b"backend", "design", b"design"] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "arguments", b"arguments", "backend", b"backend", "design", b"design", "solvedValues", b"solvedValues" + ] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___BackendRequest: _TypeAlias = BackendRequest @_typing.final @@ -416,56 +415,50 @@ class BackendResponse(_message.Message): PATH_FIELD_NUMBER: _builtins.int TEXT_FIELD_NUMBER: _builtins.int text: _builtins.str - 'for now, only text supported, for KiCad netlisting' + "for now, only text supported, for KiCad netlisting" @_builtins.property def path(self) -> _ref_pb2.LocalPath: """path of corresponding element in design tree""" - def __init__(self, *, path: _ref_pb2.LocalPath | None=..., text: _builtins.str=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['path', b'path', 'result', b'result', 'text', b'text'] + def __init__(self, *, path: _ref_pb2.LocalPath | None = ..., text: _builtins.str = ...) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal["path", b"path", "result", b"result", "text", b"text"] - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['path', b'path', 'result', b'result', 'text', b'text'] + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["path", b"path", "result", b"result", "text", b"text"] - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... - _WhichOneofReturnType_result: _TypeAlias = _typing.Literal['text'] - _WhichOneofArgType_result: _TypeAlias = _typing.Literal['result', b'result'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_result: _TypeAlias = _typing.Literal["text"] + _WhichOneofArgType_result: _TypeAlias = _typing.Literal["result", b"result"] + + def WhichOneof(self, oneof_group: _WhichOneofArgType_result) -> _WhichOneofReturnType_result | None: ... - def WhichOneof(self, oneof_group: _WhichOneofArgType_result) -> _WhichOneofReturnType_result | None: - ... RESULTS_FIELD_NUMBER: _builtins.int @_builtins.property - def results(self) -> _containers.RepeatedCompositeFieldContainer[Global___BackendResponse.Result]: - ... + def results(self) -> _containers.RepeatedCompositeFieldContainer[Global___BackendResponse.Result]: ... + def __init__(self, *, results: _abc.Iterable[Global___BackendResponse.Result] | None = ...) -> None: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["results", b"results"] - def __init__(self, *, results: _abc.Iterable[Global___BackendResponse.Result] | None=...) -> None: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['results', b'results'] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___BackendResponse: _TypeAlias = BackendResponse @_typing.final class ErrorResponse(_message.Message): """catch all error response""" + DESCRIPTOR: _descriptor.Descriptor ERROR_FIELD_NUMBER: _builtins.int TRACEBACK_FIELD_NUMBER: _builtins.int error: _builtins.str traceback: _builtins.str - def __init__(self, *, error: _builtins.str=..., traceback: _builtins.str=...) -> None: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['error', b'error', 'traceback', b'traceback'] + def __init__(self, *, error: _builtins.str = ..., traceback: _builtins.str = ...) -> None: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal["error", b"error", "traceback", b"traceback"] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... Global___ErrorResponse: _TypeAlias = ErrorResponse @_typing.final @@ -478,7 +471,7 @@ class HdlRequest(_message.Message): RUN_BACKEND_FIELD_NUMBER: _builtins.int GET_PROTO_VERSION_FIELD_NUMBER: _builtins.int get_proto_version: _builtins.int - 'no data' + "no data" @_builtins.property def index_module(self) -> Global___ModuleName: @@ -493,28 +486,67 @@ class HdlRequest(_message.Message): """returns the elaborated IR""" @_builtins.property - def run_refinement(self) -> Global___RefinementRequest: - ... - + def run_refinement(self) -> Global___RefinementRequest: ... @_builtins.property - def run_backend(self) -> Global___BackendRequest: - ... - - def __init__(self, *, index_module: Global___ModuleName | None=..., get_library_element: Global___LibraryRequest | None=..., elaborate_generator: Global___GeneratorRequest | None=..., run_refinement: Global___RefinementRequest | None=..., run_backend: Global___BackendRequest | None=..., get_proto_version: _builtins.int=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['elaborate_generator', b'elaborate_generator', 'get_library_element', b'get_library_element', 'get_proto_version', b'get_proto_version', 'index_module', b'index_module', 'request', b'request', 'run_backend', b'run_backend', 'run_refinement', b'run_refinement'] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['elaborate_generator', b'elaborate_generator', 'get_library_element', b'get_library_element', 'get_proto_version', b'get_proto_version', 'index_module', b'index_module', 'request', b'request', 'run_backend', b'run_backend', 'run_refinement', b'run_refinement'] + def run_backend(self) -> Global___BackendRequest: ... + def __init__( + self, + *, + index_module: Global___ModuleName | None = ..., + get_library_element: Global___LibraryRequest | None = ..., + elaborate_generator: Global___GeneratorRequest | None = ..., + run_refinement: Global___RefinementRequest | None = ..., + run_backend: Global___BackendRequest | None = ..., + get_proto_version: _builtins.int = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal[ + "elaborate_generator", + b"elaborate_generator", + "get_library_element", + b"get_library_element", + "get_proto_version", + b"get_proto_version", + "index_module", + b"index_module", + "request", + b"request", + "run_backend", + b"run_backend", + "run_refinement", + b"run_refinement", + ] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "elaborate_generator", + b"elaborate_generator", + "get_library_element", + b"get_library_element", + "get_proto_version", + b"get_proto_version", + "index_module", + b"index_module", + "request", + b"request", + "run_backend", + b"run_backend", + "run_refinement", + b"run_refinement", + ] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_request: _TypeAlias = _typing.Literal[ + "index_module", + "get_library_element", + "elaborate_generator", + "run_refinement", + "run_backend", + "get_proto_version", + ] + _WhichOneofArgType_request: _TypeAlias = _typing.Literal["request", b"request"] + + def WhichOneof(self, oneof_group: _WhichOneofArgType_request) -> _WhichOneofReturnType_request | None: ... - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... - _WhichOneofReturnType_request: _TypeAlias = _typing.Literal['index_module', 'get_library_element', 'elaborate_generator', 'run_refinement', 'run_backend', 'get_proto_version'] - _WhichOneofArgType_request: _TypeAlias = _typing.Literal['request', b'request'] - - def WhichOneof(self, oneof_group: _WhichOneofArgType_request) -> _WhichOneofReturnType_request | None: - ... Global___HdlRequest: _TypeAlias = HdlRequest @_typing.final @@ -534,38 +566,77 @@ class HdlResponse(_message.Message): """list of contained library elements""" @_builtins.property - def get_library_element(self) -> Global___LibraryResponse: - ... - + def get_library_element(self) -> Global___LibraryResponse: ... @_builtins.property - def elaborate_generator(self) -> Global___GeneratorResponse: - ... - + def elaborate_generator(self) -> Global___GeneratorResponse: ... @_builtins.property - def run_refinement(self) -> Global___RefinementResponse: - ... - + def run_refinement(self) -> Global___RefinementResponse: ... @_builtins.property - def run_backend(self) -> Global___BackendResponse: - ... - + def run_backend(self) -> Global___BackendResponse: ... @_builtins.property - def error(self) -> Global___ErrorResponse: - ... - - def __init__(self, *, index_module: Global___IndexResponse | None=..., get_library_element: Global___LibraryResponse | None=..., elaborate_generator: Global___GeneratorResponse | None=..., run_refinement: Global___RefinementResponse | None=..., run_backend: Global___BackendResponse | None=..., get_proto_version: _builtins.int=..., error: Global___ErrorResponse | None=...) -> None: - ... - _HasFieldArgType: _TypeAlias = _typing.Literal['elaborate_generator', b'elaborate_generator', 'error', b'error', 'get_library_element', b'get_library_element', 'get_proto_version', b'get_proto_version', 'index_module', b'index_module', 'response', b'response', 'run_backend', b'run_backend', 'run_refinement', b'run_refinement'] - - def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: - ... - _ClearFieldArgType: _TypeAlias = _typing.Literal['elaborate_generator', b'elaborate_generator', 'error', b'error', 'get_library_element', b'get_library_element', 'get_proto_version', b'get_proto_version', 'index_module', b'index_module', 'response', b'response', 'run_backend', b'run_backend', 'run_refinement', b'run_refinement'] - - def ClearField(self, field_name: _ClearFieldArgType) -> None: - ... - _WhichOneofReturnType_response: _TypeAlias = _typing.Literal['index_module', 'get_library_element', 'elaborate_generator', 'run_refinement', 'run_backend', 'get_proto_version', 'error'] - _WhichOneofArgType_response: _TypeAlias = _typing.Literal['response', b'response'] - - def WhichOneof(self, oneof_group: _WhichOneofArgType_response) -> _WhichOneofReturnType_response | None: - ... -Global___HdlResponse: _TypeAlias = HdlResponse \ No newline at end of file + def error(self) -> Global___ErrorResponse: ... + def __init__( + self, + *, + index_module: Global___IndexResponse | None = ..., + get_library_element: Global___LibraryResponse | None = ..., + elaborate_generator: Global___GeneratorResponse | None = ..., + run_refinement: Global___RefinementResponse | None = ..., + run_backend: Global___BackendResponse | None = ..., + get_proto_version: _builtins.int = ..., + error: Global___ErrorResponse | None = ..., + ) -> None: ... + _HasFieldArgType: _TypeAlias = _typing.Literal[ + "elaborate_generator", + b"elaborate_generator", + "error", + b"error", + "get_library_element", + b"get_library_element", + "get_proto_version", + b"get_proto_version", + "index_module", + b"index_module", + "response", + b"response", + "run_backend", + b"run_backend", + "run_refinement", + b"run_refinement", + ] + + def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... + _ClearFieldArgType: _TypeAlias = _typing.Literal[ + "elaborate_generator", + b"elaborate_generator", + "error", + b"error", + "get_library_element", + b"get_library_element", + "get_proto_version", + b"get_proto_version", + "index_module", + b"index_module", + "response", + b"response", + "run_backend", + b"run_backend", + "run_refinement", + b"run_refinement", + ] + + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType_response: _TypeAlias = _typing.Literal[ + "index_module", + "get_library_element", + "elaborate_generator", + "run_refinement", + "run_backend", + "get_proto_version", + "error", + ] + _WhichOneofArgType_response: _TypeAlias = _typing.Literal["response", b"response"] + + def WhichOneof(self, oneof_group: _WhichOneofArgType_response) -> _WhichOneofReturnType_response | None: ... + +Global___HdlResponse: _TypeAlias = HdlResponse From 49159217982d17f729ba655f7ebe981734a4caf0 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 25 Apr 2026 19:47:19 -0700 Subject: [PATCH 23/25] fix --- edg/core/CompiledDesignExport.py | 3 ++- edg/core/test_compiled_design_export.py | 10 ++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/edg/core/CompiledDesignExport.py b/edg/core/CompiledDesignExport.py index 5fa335006..844c8df7c 100644 --- a/edg/core/CompiledDesignExport.py +++ b/edg/core/CompiledDesignExport.py @@ -1,4 +1,5 @@ -from typing import Optional, Dict, List, Any, Union, Mapping, Literal, override +from typing import Optional, Dict, List, Any, Union, Mapping +from typing_extensions import override import re from pydantic import BaseModel, RootModel diff --git a/edg/core/test_compiled_design_export.py b/edg/core/test_compiled_design_export.py index 1ebba56f0..c7bb8baae 100644 --- a/edg/core/test_compiled_design_export.py +++ b/edg/core/test_compiled_design_export.py @@ -1,6 +1,8 @@ import unittest +from typing import cast -from edg import ScalaCompiler, CompiledDesignExportTransform +from . import * +from .CompiledDesignExport import CompiledPort class CompiledDesignExportTestCase(unittest.TestCase): @@ -13,9 +15,9 @@ def test_hierarchy(self) -> None: self.assertEqual(result.blocks["sink1"].cls, "edg.core.test_common.TestBlockSink") self.assertEqual(result.blocks["sink2"].cls, "edg.core.test_common.TestBlockSink") self.assertEqual(result.links["test_net"].cls, "edg.core.test_common.TestLink") - self.assertEqual(result.blocks["source"].ports["source"].connected_path, "test_net.source") - self.assertEqual(result.blocks["sink1"].ports["sink"].connected_path, "test_net.sinks.0") - self.assertEqual(result.blocks["sink2"].ports["sink"].connected_path, "test_net.sinks.1") + self.assertEqual(cast(CompiledPort, result.blocks["source"].ports["source"]).connected_path, "test_net.source") + self.assertEqual(cast(CompiledPort, result.blocks["sink1"].ports["sink"]).connected_path, "test_net.sinks.0") + self.assertEqual(cast(CompiledPort, result.blocks["sink2"].ports["sink"]).connected_path, "test_net.sinks.1") def test_param_values(self) -> None: from .test_simple_expr_eval import TestEvalReductionBlock From da14c9095095ec0c52ec0c2149fa914bd344757b Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 25 Apr 2026 19:48:52 -0700 Subject: [PATCH 24/25] Update FnTransformUtil.py --- edg/core/FnTransformUtil.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/edg/core/FnTransformUtil.py b/edg/core/FnTransformUtil.py index 73a8bf10d..41b71822b 100644 --- a/edg/core/FnTransformUtil.py +++ b/edg/core/FnTransformUtil.py @@ -1,4 +1,5 @@ -from typing import TypeVar, Generic, Mapping, Union, Dict +from typing import Generic, Mapping, Union, Dict +from typing_extensions import TypeVar from .. import edgir from .ScalaCompilerInterface import CompiledDesign From 03dc69ce71bd37235212bdc7f3d606425e1f5ac2 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 25 Apr 2026 19:52:16 -0700 Subject: [PATCH 25/25] fix re --- edg/core/CompiledDesignExport.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/edg/core/CompiledDesignExport.py b/edg/core/CompiledDesignExport.py index 844c8df7c..005adf76b 100644 --- a/edg/core/CompiledDesignExport.py +++ b/edg/core/CompiledDesignExport.py @@ -214,13 +214,13 @@ def postprocess_serialized_json(json_str: str) -> str: # post-process the json string to compactify the param dict and range lists # compress range lists onto one line json_str = re.sub( - r""""type":\s*"range",(\s*)"value":\s*\[\s*([\S]+),\s*([\S]+)\s*\]""", - lambda m: f""""type": "range",{m.group(1)}"value": [{m.group(2)}, {m.group(3)}]""", + r'"type":\s*"range",(\s*)"value":\s*\[\s*([\S]+),\s*([\S]+)\s*\]', + lambda m: rf'"type": "range",{m.group(1)}"value": [{m.group(2)}, {m.group(3)}]', json_str, ) json_str = re.sub( - r"""\{\s*"type":\s*"(\S+)",\s*"value":\s*(.+)\s*\}""", - lambda m: f"""{{ "type": "{m.group(1)}", "value": {m.group(2)} }}""", + r'\{\s*"type":\s*"(\S+)",\s*"value":\s*(.+)\s*\}', + lambda m: rf'{{ "type": "{m.group(1)}", "value": {m.group(2)} }}', json_str, ) return json_str