Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
21 changes: 7 additions & 14 deletions edg/core/Array.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,10 @@ def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
return [self.container]

@override
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
def populate_expr_proto(self, pb: edgir.ValueExpr, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> None:
contained_map = self.container._get_elt_sample()._create_ref_map(edgir.LocalPath())

pb = edgir.ValueExpr()
pb.map_extract.container.ref.CopyFrom(ref_map[self.container]) # TODO support arbitrary refs
pb.map_extract.path.CopyFrom(contained_map[self.elt])
return pb


class FlattenBinding(Binding):
Expand All @@ -48,11 +45,9 @@ def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
return [self.elts]

@override
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
pb = edgir.ValueExpr()
def populate_expr_proto(self, pb: edgir.ValueExpr, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> None:
pb.unary_set.op = edgir.UnarySetExpr.Op.FLATTEN
pb.unary_set.vals.CopyFrom(self.elts._expr_to_proto(ref_map))
return pb
self.elts._populate_expr_proto(pb.unary_set.vals, ref_map)


@non_library
Expand Down Expand Up @@ -91,8 +86,8 @@ def _get_elt_sample(self) -> BasePort:
return self.target

@override
def _instance_to_proto(self) -> edgir.PortLike:
raise RuntimeError() # this doesn't generate into a library element
def _populate_portlike_proto(self, pb: edgir.PortLike) -> None:
raise RuntimeError() # this can't be a block's port

@override
def _def_to_proto(self) -> edgir.PortTypes:
Expand Down Expand Up @@ -184,14 +179,12 @@ def _get_def_name(self) -> str:
raise RuntimeError() # this doesn't generate into a library element

@override
def _instance_to_proto(self) -> edgir.PortLike:
pb = edgir.PortLike()
def _populate_portlike_proto(self, pb: edgir.PortLike) -> None:
pb.array.self_class.target.name = self._elt_sample._get_def_name()
if self._elts is not None:
pb.array.ports.SetInParent() # mark as defined, even if empty
for name, elt in self._elts.items():
edgir.add_pair(pb.array.ports.ports, name).CopyFrom(elt._instance_to_proto())
return pb
elt._populate_portlike_proto(edgir.add_pair(pb.array.ports.ports, name))

@override
def _def_to_proto(self) -> edgir.PortTypes:
Expand Down
8 changes: 3 additions & 5 deletions edg/core/ArrayExpr.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]: # element
return []

@override
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
def populate_expr_proto(self, pb: edgir.ValueExpr, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> None:
raise ValueError # can't be used directly


Expand Down Expand Up @@ -61,10 +61,8 @@ def _to_expr_type(cls: Type[SelfType], input: ArrayCastableType) -> SelfType:

@classmethod
@override
def _decl_to_proto(cls) -> edgir.ValInit:
pb = edgir.ValInit()
pb.array.CopyFrom(cls._elt_type._decl_to_proto())
return pb
def _populate_decl_proto(cls, pb: edgir.ValInit) -> None:
cls._elt_type._populate_decl_proto(pb.array)

@staticmethod
def array_of_elt(elt: ConstraintExpr) -> ArrayExpr:
Expand Down
147 changes: 60 additions & 87 deletions edg/core/Binding.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ def is_bound(self) -> bool:
return True

@abstractmethod
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr: ...
def populate_expr_proto(self, pb: edgir.ValueExpr, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> None: ...

@abstractmethod
def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]: ...
Expand Down Expand Up @@ -106,10 +106,8 @@ def is_bound(self) -> bool:
return True

@override
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
pb = edgir.ValueExpr()
def populate_expr_proto(self, pb: edgir.ValueExpr, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> None:
pb.ref.CopyFrom(ref_map[expr])
return pb


class InitParamBinding(ParamBinding):
Expand All @@ -126,6 +124,14 @@ class LiteralBinding(Binding):
def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
return []

@abstractmethod
def populate_literal_proto(self, pb: edgir.ValueLit) -> None:
raise NotImplementedError

@override
def populate_expr_proto(self, pb: edgir.ValueExpr, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> None:
self.populate_literal_proto(pb.literal)


class BoolLiteralBinding(LiteralBinding):
@override
Expand All @@ -137,10 +143,8 @@ def __init__(self, value: bool):
self.value = value

@override
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
pb = edgir.ValueExpr()
pb.literal.boolean.val = self.value
return pb
def populate_literal_proto(self, pb: edgir.ValueLit) -> None:
pb.boolean.val = self.value


class IntLiteralBinding(LiteralBinding):
Expand All @@ -152,10 +156,8 @@ def __init__(self, value: int):
self.value = value

@override
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
pb = edgir.ValueExpr()
pb.literal.integer.val = self.value
return pb
def populate_literal_proto(self, pb: edgir.ValueLit) -> None:
pb.integer.val = self.value


class FloatLiteralBinding(LiteralBinding):
Expand All @@ -167,10 +169,8 @@ def __init__(self, value: Union[float, int]):
self.value: float = float(value)

@override
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
pb = edgir.ValueExpr()
pb.literal.floating.val = self.value
return pb
def populate_literal_proto(self, pb: edgir.ValueLit) -> None:
pb.floating.val = self.value


class RangeLiteralBinding(LiteralBinding):
Expand All @@ -182,11 +182,9 @@ def __init__(self, value: Range):
self.value = value

@override
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
pb = edgir.ValueExpr()
pb.literal.range.minimum.floating.val = self.value.lower
pb.literal.range.maximum.floating.val = self.value.upper
return pb
def populate_literal_proto(self, pb: edgir.ValueLit) -> None:
pb.range.minimum.floating.val = self.value.lower
pb.range.maximum.floating.val = self.value.upper


class StringLiteralBinding(LiteralBinding):
Expand All @@ -199,10 +197,8 @@ def __init__(self, value: str):
self.value = value

@override
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
pb = edgir.ValueExpr()
pb.literal.text.val = self.value
return pb
def populate_literal_proto(self, pb: edgir.ValueLit) -> None:
pb.text.val = self.value


class ArrayLiteralBinding(LiteralBinding):
Expand All @@ -215,14 +211,10 @@ def __init__(self, values: Sequence[LiteralBinding]):
self.values = values

@override
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
pb = edgir.ValueExpr()
pb.literal.array.SetInParent()
def populate_literal_proto(self, pb: edgir.ValueLit) -> None:
pb.array.SetInParent()
for value in self.values:
elt_value = value.expr_to_proto(expr, ref_map)
assert elt_value.HasField('literal')
pb.literal.array.elts.add().CopyFrom(elt_value.literal)
return pb
value.populate_literal_proto(pb.array.elts.add())


class RangeBuilderBinding(Binding):
Expand All @@ -240,15 +232,13 @@ def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
return chain(self.lower._get_exprs(), self.lower._get_exprs())

@override
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
pb = edgir.ValueExpr()
def populate_expr_proto(self, pb: edgir.ValueExpr, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> None:
pb.binary.op = edgir.BinaryExpr.RANGE
pb.binary.lhs.CopyFrom(self.lower._expr_to_proto(ref_map))
pb.binary.rhs.CopyFrom(self.upper._expr_to_proto(ref_map))
return pb
self.lower._populate_expr_proto(pb.binary.lhs, ref_map)
self.upper._populate_expr_proto(pb.binary.rhs, ref_map)


class ArrayBinding(LiteralBinding):
class ArrayBinding(Binding):
@override
def __repr__(self) -> str:
return f"Array({self.values})"
Expand All @@ -258,12 +248,14 @@ def __init__(self, values: Sequence[ConstraintExpr]):
self.values = values

@override
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
pb = edgir.ValueExpr()
def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
return self.values

@override
def populate_expr_proto(self, pb: edgir.ValueExpr, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> None:
pb.array.SetInParent()
for value in self.values:
pb.array.vals.add().CopyFrom(value._expr_to_proto(ref_map))
return pb
value._populate_expr_proto(pb.array.vals.add(), ref_map)


class UnaryOpBinding(Binding):
Expand Down Expand Up @@ -293,12 +285,9 @@ def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
return chain(self.src._get_exprs())

@override
def expr_to_proto(self, expr: ConstraintExpr,
ref_map: Refable.RefMapType) -> edgir.ValueExpr:
pb = edgir.ValueExpr()
def populate_expr_proto(self, pb: edgir.ValueExpr, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> None:
pb.unary.op = self.op_map[self.op]
pb.unary.val.CopyFrom(self.src._expr_to_proto(ref_map))
return pb
self.src._populate_expr_proto(pb.unary.val, ref_map)

class UnarySetOpBinding(Binding):
@override
Expand Down Expand Up @@ -332,12 +321,9 @@ def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
return chain(self.src._get_exprs())

@override
def expr_to_proto(self, expr: ConstraintExpr,
ref_map: Refable.RefMapType) -> edgir.ValueExpr:
pb = edgir.ValueExpr()
def populate_expr_proto(self, pb: edgir.ValueExpr, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> None:
pb.unary_set.op = self.op_map[self.op]
pb.unary_set.vals.CopyFrom(self.src._expr_to_proto(ref_map))
return pb
self.src._populate_expr_proto(pb.unary_set.vals, ref_map)

class BinaryOpBinding(Binding):
@override
Expand Down Expand Up @@ -385,12 +371,11 @@ def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
return chain(self.lhs._get_exprs(), self.rhs._get_exprs())

@override
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
pb = edgir.ValueExpr()
def populate_expr_proto(self, pb: edgir.ValueExpr, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> None:
pb.binary.op = self.op_map[self.op]
pb.binary.lhs.CopyFrom(self.lhs._expr_to_proto(ref_map))
pb.binary.rhs.CopyFrom(self.rhs._expr_to_proto(ref_map))
return pb
self.lhs._populate_expr_proto(pb.binary.lhs, ref_map)
self.rhs._populate_expr_proto(pb.binary.rhs, ref_map)


class BinarySetOpBinding(Binding):
@override
Expand All @@ -417,12 +402,10 @@ def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
return chain(self.lhset._get_exprs(), self.rhs._get_exprs())

@override
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
pb = edgir.ValueExpr()
def populate_expr_proto(self, pb: edgir.ValueExpr, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> None:
pb.binary_set.op = self.op_map[self.op]
pb.binary_set.lhset.CopyFrom(self.lhset._expr_to_proto(ref_map))
pb.binary_set.rhs.CopyFrom(self.rhs._expr_to_proto(ref_map))
return pb
self.lhset._populate_expr_proto(pb.binary_set.lhset, ref_map)
self.rhs._populate_expr_proto(pb.binary_set.rhs, ref_map)


class IfThenElseBinding(Binding):
Expand All @@ -441,12 +424,10 @@ def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
return chain(self.cond._get_exprs(), self.then_val._get_exprs(), self.else_val._get_exprs())

@override
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
pb = edgir.ValueExpr()
pb.ifThenElse.cond.CopyFrom(self.cond._expr_to_proto(ref_map))
pb.ifThenElse.tru.CopyFrom(self.then_val._expr_to_proto(ref_map))
pb.ifThenElse.fal.CopyFrom(self.else_val._expr_to_proto(ref_map))
return pb
def populate_expr_proto(self, pb: edgir.ValueExpr, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> None:
self.cond._populate_expr_proto(pb.ifThenElse.cond, ref_map)
self.then_val._populate_expr_proto(pb.ifThenElse.tru, ref_map)
self.else_val._populate_expr_proto(pb.ifThenElse.fal, ref_map)


class IsConnectedBinding(Binding):
Expand All @@ -463,11 +444,10 @@ def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
return [self.src]

@override
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
pb = edgir.ValueExpr()
def populate_expr_proto(self, pb: edgir.ValueExpr, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> None:
pb.ref.CopyFrom(ref_map[self.src])
pb.ref.steps.add().reserved_param = edgir.IS_CONNECTED
return pb


class NameBinding(Binding):
@override
Expand All @@ -483,11 +463,9 @@ def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
return []

@override
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
pb = edgir.ValueExpr()
def populate_expr_proto(self, pb: edgir.ValueExpr, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> None:
pb.ref.CopyFrom(ref_map[self.src])
pb.ref.steps.add().reserved_param = edgir.NAME
return pb


class LengthBinding(Binding):
Expand All @@ -504,11 +482,9 @@ def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
return [self.src]

@override
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
pb = edgir.ValueExpr()
def populate_expr_proto(self, pb: edgir.ValueExpr, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> None:
pb.ref.CopyFrom(ref_map[self.src])
pb.ref.steps.add().reserved_param = edgir.LENGTH
return pb


class AllocatedBinding(Binding):
Expand All @@ -525,21 +501,17 @@ def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
return [self.src]

@override
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
pb = edgir.ValueExpr()
def populate_expr_proto(self, pb: edgir.ValueExpr, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> None:
pb.ref.CopyFrom(ref_map[self.src])
pb.ref.steps.add().reserved_param = edgir.ALLOCATED
return pb


class AssignBinding(Binding):
# Convenience method to make an assign expr without the rest of this proto infrastructure
@staticmethod
def make_assign(target: ConstraintExpr, value: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
pb = edgir.ValueExpr()
def populate_assign_proto(pb: edgir.ValueExpr, target: ConstraintExpr, value: ConstraintExpr, ref_map: Refable.RefMapType) -> None:
# Convenience method to make an assign expr without the rest of this proto infrastructure
pb.assign.dst.CopyFrom(ref_map[target])
pb.assign.src.CopyFrom(value._expr_to_proto(ref_map))
return pb
value._populate_expr_proto(pb.assign.src, ref_map)

@override
def __repr__(self) -> str:
Expand All @@ -555,5 +527,6 @@ def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
return [self.value]

@override
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
return self.make_assign(self.target, self.value, ref_map)
def populate_expr_proto(self, pb: edgir.ValueExpr, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> None:
pb.assign.dst.CopyFrom(ref_map[self.target])
self.value._populate_expr_proto(pb.assign.src, ref_map)
Loading
Loading