Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
cf88598
remove custom init
ducky64 Oct 25, 2026
3e780ff
Update Blocks.py
ducky64 Oct 25, 2026
d138e3b
make manager internal
ducky64 Oct 25, 2026
377abcb
patchy refactoring of param naming system
ducky64 Oct 31, 2026
800658e
fixes
ducky64 Oct 31, 2026
f603a04
quickndirty source locator infrastructure
ducky64 Oct 31, 2026
a8cbfd7
fix missing register in multipack case
ducky64 Oct 31, 2026
745de00
improve naming flow
ducky64 Oct 31, 2026
12080db
Update Connectors.py
ducky64 Oct 31, 2026
f7e61dc
Update DesignTop.py
ducky64 Oct 31, 2026
b1a5e84
lazy source locators
ducky64 Oct 31, 2026
4ea3676
basic Block._ports refactor
ducky64 Oct 31, 2026
f6eaa0a
wip extract base trait
ducky64 Oct 31, 2026
e37573f
move code
ducky64 Oct 31, 2026
5d1b29f
refactoring
ducky64 Oct 31, 2026
e0c2a12
Update HierarchyBlock.py
ducky64 Oct 31, 2026
863d52f
refactor blocks
ducky64 Oct 31, 2026
b75ff39
fix multipack manager
ducky64 Oct 31, 2026
f4c5348
update elementdict
ducky64 Oct 31, 2026
f54fcfc
Update test_block_portvector.py
ducky64 Oct 31, 2026
df1fd03
split single and path case
ducky64 Oct 31, 2026
f3d4af3
cleaning
ducky64 Nov 1, 2026
43b5938
Update Ports.py
ducky64 Nov 1, 2026
10b0842
Update CircuitBlock.py
ducky64 Nov 1, 2026
34e0347
Update Blocks.py
ducky64 Nov 1, 2026
eaf23c7
Update Ports.py
ducky64 Nov 1, 2026
a795a91
Update SubboardBlock.py
ducky64 Nov 1, 2026
8cf81e3
Update IoControllerWrapper.py
ducky64 Nov 1, 2026
9382b4d
fix
ducky64 Nov 1, 2026
6bf035c
revert
ducky64 Nov 1, 2026
46262d5
Update Generator.py
ducky64 Nov 1, 2026
60f1dd2
Update Generator.py
ducky64 Nov 1, 2026
7031287
cleaning
ducky64 Nov 1, 2026
c07ed62
Update Core.py
ducky64 Nov 1, 2026
a67fd2c
refactor port params
ducky64 Nov 1, 2026
520c898
bulk rename
ducky64 Nov 1, 2026
01002b8
refactor connect naming
ducky64 Nov 1, 2026
5a94dc5
catch dupe name on use
ducky64 Nov 1, 2026
06c9d61
refactor metadata
ducky64 Nov 1, 2026
f8d0293
refactor constraints
ducky64 Nov 1, 2026
47261cc
dce
ducky64 Nov 1, 2026
e0eac66
Update Blocks.py
ducky64 Nov 1, 2026
d9333ca
cleaning
ducky64 Nov 1, 2026
ba6c9d5
rebaseline netlist, only ordering changes
ducky64 Nov 1, 2026
b386ac7
rebaseline
ducky64 Nov 1, 2026
ee1901d
dependent names
ducky64 Nov 1, 2026
94ed9dd
cleaning
ducky64 Nov 1, 2026
07be628
Update Core.py
ducky64 Nov 1, 2026
a2fd264
Update Core.py
ducky64 Nov 1, 2026
4ed0026
fix mypy
ducky64 Nov 1, 2026
ebe754a
fix frame mutability, stage name resolution
ducky64 Nov 1, 2026
08dead4
resolve function names on use
ducky64 Nov 1, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions edg/abstract_parts/Connectors.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@ def __init__(self) -> None:
class RfConnectorTestPoint(BlockInterfaceMixin[RfConnector]):
"""Test point mixin that allows the footprint to take a name"""

def __init__(self, name: StringLike):
def __init__(self, tp_name: StringLike):
super().__init__()
self.tp_name = self.ArgParameter(name)
self.tp_name = self.ArgParameter(tp_name)


class RfConnectorAntenna(Antenna):
Expand Down
6 changes: 2 additions & 4 deletions edg/abstract_parts/IoController.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ def connect_port_transformed(self_io: BasePort, inner_io: Callable[[], BasePort]
if transform_fn is None:
self.connect(self_io, inner_io)
else:
connect_port_transformed(self_io, lambda: inner_io, self_io._name_from(self))
connect_port_transformed(self_io, lambda: inner_io, self._path_name_of(self_io))
else:
raise NotImplementedError(f"unknown port type {self_io}")

Expand Down Expand Up @@ -293,9 +293,7 @@ def _make_pinning(self) -> Mapping[Union[Iterable[str], str], Union[Passive, Has
allocation_list.append((io_port.elt_type(), self.get(io_port.requested())))
elif isinstance(io_port, Port): # derive Port connections from is_connected
if self.get(io_port.is_connected()):
requested = [
self._name_of_child(io_port, self)
] # generate requested name from port name if connected
requested = [self._name_of(io_port)] # generate requested name from port name if connected
else:
requested = []
allocation_list.append((type(io_port), requested))
Expand Down
12 changes: 6 additions & 6 deletions edg/abstract_parts/IoControllerWrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,8 @@ def recurse_port(port: Port, prefix: str) -> None:
assert prefix not in pin_dict, f"duplicate pin name {prefix}"
pin_dict[prefix] = port

for subport_name, subport in port._ports.items():
recurse_port(subport, f"{prefix}.{subport_name}")
for subport in port._ports:
recurse_port(subport, f"{prefix}.{port._name_of(subport)}")

for io_port in self._io_ports:
if isinstance(io_port, Vector):
Expand All @@ -91,7 +91,7 @@ def recurse_port(port: Port, prefix: str) -> None:
recurse_port(subport, subport_name)
elif isinstance(io_port, Port):
if self.get(io_port.is_connected()):
port_name = io_port._name_from(self)
port_name = self._path_name_of(io_port)
recurse_port(io_port, port_name)
else:
raise NotImplementedError(f"unknown port type {io_port}")
Expand Down Expand Up @@ -203,16 +203,16 @@ def recurse_port(port: Port, prefix: str) -> None:
assert prefix not in pin_type_dict, f"duplicate pin name {prefix}"
pin_type_dict[prefix] = type(port)

for subport_name, subport in port._ports.items():
recurse_port(subport, f"{prefix}.{subport_name}")
for subport in port._ports:
recurse_port(subport, f"{prefix}.{port._name_of(subport)}")

for io_port in self._io_ports:
if isinstance(io_port, Vector):
for subport_name in self.get(io_port.requested()):
recurse_port(io_port._tpe.empty(), subport_name)
elif isinstance(io_port, Port):
if self.get(io_port.is_connected()):
port_name = io_port._name_from(self)
port_name = self._name_of(io_port)
recurse_port(io_port, port_name)
else:
raise NotImplementedError(f"unknown port type {io_port}")
Expand Down
3 changes: 2 additions & 1 deletion edg/abstract_parts/PinMappable.py
Original file line number Diff line number Diff line change
Expand Up @@ -435,7 +435,8 @@ def try_allocate_resource(
resource_model = resource.port_model # typer gets confused if this is put directly where it is used
inner_models = {}
resource_name = resource.name # typer gets confused if this is put directly where it is used
for inner_name, inner_model in resource.port_model._ports.items():
for inner_model in resource.port_model._ports:
inner_name = resource.port_model._name_of(inner_model)
inner_type = type(inner_model)
if inner_type in self.transforms: # apply transform to search for the resource type, if needed
inner_type = self.transforms[inner_type][0]
Expand Down
45 changes: 18 additions & 27 deletions edg/core/Array.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,36 +155,20 @@ def items(self) -> ItemsView[str, VectorType]:

# unlike most other LibraryElement types, the names are stored in _elts and _allocates
@override
def _name_of_child(self, subelt: Any, context: Any, allow_unknown: bool = False) -> str:
from .HierarchyBlock import Block

block_parent = self._block_parent()
assert isinstance(block_parent, Block)

if context is block_parent:
# in block defining this port (direct elt definition), or in test top
assert self._elts is not None, "can't get name on undefined vector"
def _name_of(self, subelt: Any, *, debug: bool = False) -> str:
if self._elts is not None:
for name, elt in self._elts.items():
if subelt is elt:
return name
if allow_unknown:
return f"(unknown {subelt.__class__.__name__})"
else:
raise ValueError(f"no name for {subelt}")
elif context is block_parent._parent:
# in block enclosing the block defining this port (allocate required)
for i, (suggested_name, allocate_elt) in enumerate(self._requests):
if subelt is allocate_elt:
if suggested_name is not None:
return suggested_name
else:
return f"_allocate_{i}"
if allow_unknown:
return f"(unknown {subelt.__class__.__name__})"
else:
raise ValueError(f"allocated elt not found {subelt}")
else:
raise ValueError(f"unknown context of array")

for i, (suggested_name, allocate_elt) in enumerate(self._requests):
if subelt is allocate_elt:
if suggested_name is not None:
return suggested_name
else:
return f"_allocate_{i}"

raise ValueError(f"{subelt} not in Vector")

@override
def _get_elt_sample(self) -> BasePort:
Expand Down Expand Up @@ -338,14 +322,19 @@ def validate_selector(expected: Type[SelectorType], result: ConstraintExpr) -> S
# See the note in ArrayExpr for why this is expanded.
@overload
def map_extract(self, selector: Callable[[VectorType], BoolExpr]) -> ArrayBoolExpr: ...

@overload
def map_extract(self, selector: Callable[[VectorType], IntExpr]) -> ArrayIntExpr: ...

@overload
def map_extract(self, selector: Callable[[VectorType], FloatExpr]) -> ArrayFloatExpr: ...

@overload
def map_extract(self, selector: Callable[[VectorType], RangeExpr]) -> ArrayRangeExpr: ...

@overload
def map_extract(self, selector: Callable[[VectorType], StringExpr]) -> ArrayStringExpr: ...

@overload
def map_extract(self, selector: Callable[[VectorType], ExtractPortType]) -> DerivedVector[ExtractPortType]: ...

Expand Down Expand Up @@ -377,8 +366,10 @@ def count(self, selector: Callable[[VectorType], BoolExpr]) -> IntExpr:

@overload
def sum(self, selector: Callable[[VectorType], RangeExpr]) -> RangeExpr: ...

@overload
def sum(self, selector: Callable[[VectorType], FloatExpr]) -> FloatExpr: ...

def sum(self, selector: Callable[[VectorType], Union[RangeExpr, FloatExpr]]) -> Union[RangeExpr, FloatExpr]:
param = selector(self._elt_sample)
if isinstance(param, FloatExpr):
Expand Down
4 changes: 2 additions & 2 deletions edg/core/BlockInterfaceMixin.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import Generic, Type, List, Optional, get_args, get_origin, Tuple, Callable, Any
from typing_extensions import TypeVar, override

from .Core import non_library, HasMetadata
from .Core import non_library, HasMetadata, LibraryElement
from .Blocks import AbstractBlockProperty
from .HdlUserExceptions import BlockDefinitionError
from .HierarchyBlock import Block
Expand Down Expand Up @@ -30,7 +30,7 @@ class BlockInterfaceMixin(Block, Generic[MixinBaseType]):
TODO: what about cases where it's a bit mixed, e.g. HasI2s also needs to register the self.i2s port?
"""

BaseType = TypeVar("BaseType", bound=HasMetadata)
BaseType = TypeVar("BaseType", bound=LibraryElement)

@classmethod
@override
Expand Down
Loading
Loading