Skip to content

Commit a152283

Browse files
authored
Refmap optimization (#436)
Optimizes refmap construction by using a mutable builder instead of the repeated copies needed with the previous functional style. Shaves about ~10s off the test suite. Also generates refmaps only for sub-block interfaces (instead of the full sub-block, recursively) and avoids creating refmap multiple times by creating the refmap only once and passing the refmap into the _populate_..., and eliminates the return from those functions since they rely on mutating the input. These shave another ~5s off the test suite.
1 parent 26f6bc1 commit a152283

File tree

14 files changed

+119
-174
lines changed

14 files changed

+119
-174
lines changed

edg/core/Array.py

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@ def __init__(self, container: Vector, elt: ConstraintExpr):
2424
def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
2525
return [self.container]
2626

27-
def expr_to_proto(self, expr: ConstraintExpr, ref_map: IdentityDict[Refable, edgir.LocalPath]) -> edgir.ValueExpr:
28-
contained_map = self.container._get_contained_ref_map()
27+
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
28+
contained_map = self.container._elt_sample._create_ref_map(edgir.LocalPath())
29+
2930
pb = edgir.ValueExpr()
3031
pb.map_extract.container.ref.CopyFrom(ref_map[self.container]) # TODO support arbitrary refs
3132
pb.map_extract.path.CopyFrom(contained_map[self.elt])
@@ -40,7 +41,7 @@ def __init__(self, elts: ConstraintExpr):
4041
def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
4142
return [self.elts]
4243

43-
def expr_to_proto(self, expr: ConstraintExpr, ref_map: IdentityDict[Refable, edgir.LocalPath]) -> edgir.ValueExpr:
44+
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
4445
pb = edgir.ValueExpr()
4546
pb.unary_set.op = edgir.UnarySetExpr.Op.FLATTEN
4647
pb.unary_set.vals.CopyFrom(self.elts._expr_to_proto(ref_map))
@@ -178,16 +179,15 @@ def _instance_to_proto(self) -> edgir.PortLike:
178179
def _def_to_proto(self) -> edgir.PortTypes:
179180
raise RuntimeError() # this doesn't generate into a library element
180181

181-
def _get_ref_map(self, prefix: edgir.LocalPath) -> IdentityDict[Refable, edgir.LocalPath]:
182+
def _build_ref_map(self, ref_map: Refable.RefMapType, prefix: edgir.LocalPath) -> None:
183+
super()._build_ref_map(ref_map, prefix)
184+
ref_map[self._length] = edgir.localpath_concat(prefix, edgir.LENGTH)
185+
ref_map[self._requested] = edgir.localpath_concat(prefix, edgir.ALLOCATED)
182186
elts_items = self._elts.items() if self._elts is not None else []
183-
184-
return super()._get_ref_map(prefix) + IdentityDict[Refable, edgir.LocalPath](
185-
[(self._length, edgir.localpath_concat(prefix, edgir.LENGTH)),
186-
(self._requested, edgir.localpath_concat(prefix, edgir.ALLOCATED))],
187-
*[elt._get_ref_map(edgir.localpath_concat(prefix, index)) for (index, elt) in elts_items]) + IdentityDict(
188-
*[elt._get_ref_map(edgir.localpath_concat(prefix, edgir.Allocate(suggested_name)))
189-
for (suggested_name, elt) in self._requests]
190-
)
187+
for index, elt in elts_items:
188+
elt._build_ref_map(ref_map, edgir.localpath_concat(prefix, index))
189+
for suggested_name, request in self._requests:
190+
request._build_ref_map(ref_map, edgir.localpath_concat(prefix, edgir.Allocate(suggested_name)))
191191

192192
def _get_initializers(self, path_prefix: List[str]) -> List[Tuple[ConstraintExpr, List[str], ConstraintExpr]]:
193193
if self._elts is not None:
@@ -196,9 +196,6 @@ def _get_initializers(self, path_prefix: List[str]) -> List[Tuple[ConstraintExpr
196196
else:
197197
return []
198198

199-
def _get_contained_ref_map(self) -> IdentityDict[Refable, edgir.LocalPath]:
200-
return self._elt_sample._get_ref_map(edgir.LocalPath())
201-
202199
def defined(self) -> None:
203200
"""Marks this vector as defined, even if it is empty. Can be called multiple times, and append_elt can continue
204201
to be used.

edg/core/ArrayExpr.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def __init__(self):
2020
def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]: # element should be returned by the containing ConstraintExpr
2121
return []
2222

23-
def expr_to_proto(self, expr: ConstraintExpr, ref_map: IdentityDict[Refable, edgir.LocalPath]) -> edgir.ValueExpr:
23+
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
2424
raise ValueError # can't be used directly
2525

2626

edg/core/Binding.py

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ def is_bound(self) -> bool:
7373
return True
7474

7575
@abstractmethod
76-
def expr_to_proto(self, expr: ConstraintExpr, ref_map: IdentityDict[Refable, edgir.LocalPath]) -> edgir.ValueExpr: ...
76+
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr: ...
7777

7878
@abstractmethod
7979
def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]: ...
@@ -100,7 +100,7 @@ def is_bound(self) -> bool:
100100
else:
101101
return True
102102

103-
def expr_to_proto(self, expr: ConstraintExpr, ref_map: IdentityDict[Refable, edgir.LocalPath]) -> edgir.ValueExpr:
103+
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
104104
pb = edgir.ValueExpr()
105105
pb.ref.CopyFrom(ref_map[expr])
106106
return pb
@@ -128,7 +128,7 @@ def __init__(self, value: bool):
128128
super().__init__()
129129
self.value = value
130130

131-
def expr_to_proto(self, expr: ConstraintExpr, ref_map: IdentityDict[Refable, edgir.LocalPath]) -> edgir.ValueExpr:
131+
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
132132
pb = edgir.ValueExpr()
133133
pb.literal.boolean.val = self.value
134134
return pb
@@ -141,7 +141,7 @@ def __repr__(self) -> str:
141141
def __init__(self, value: int):
142142
self.value = value
143143

144-
def expr_to_proto(self, expr: ConstraintExpr, ref_map: IdentityDict[Refable, edgir.LocalPath]) -> edgir.ValueExpr:
144+
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
145145
pb = edgir.ValueExpr()
146146
pb.literal.integer.val = self.value
147147
return pb
@@ -154,7 +154,7 @@ def __repr__(self) -> str:
154154
def __init__(self, value: Union[float, int]):
155155
self.value: float = float(value)
156156

157-
def expr_to_proto(self, expr: ConstraintExpr, ref_map: IdentityDict[Refable, edgir.LocalPath]) -> edgir.ValueExpr:
157+
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
158158
pb = edgir.ValueExpr()
159159
pb.literal.floating.val = self.value
160160
return pb
@@ -167,7 +167,7 @@ def __repr__(self) -> str:
167167
def __init__(self, value: Range):
168168
self.value = value
169169

170-
def expr_to_proto(self, expr: ConstraintExpr, ref_map: IdentityDict[Refable, edgir.LocalPath]) -> edgir.ValueExpr:
170+
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
171171
pb = edgir.ValueExpr()
172172
pb.literal.range.minimum.floating.val = self.value.lower
173173
pb.literal.range.maximum.floating.val = self.value.upper
@@ -182,7 +182,7 @@ def __init__(self, value: str):
182182
super().__init__()
183183
self.value = value
184184

185-
def expr_to_proto(self, expr: ConstraintExpr, ref_map: IdentityDict[Refable, edgir.LocalPath]) -> edgir.ValueExpr:
185+
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
186186
pb = edgir.ValueExpr()
187187
pb.literal.text.val = self.value
188188
return pb
@@ -196,7 +196,7 @@ def __init__(self, values: Sequence[LiteralBinding]):
196196
super().__init__()
197197
self.values = values
198198

199-
def expr_to_proto(self, expr: ConstraintExpr, ref_map: IdentityDict[Refable, edgir.LocalPath]) -> edgir.ValueExpr:
199+
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
200200
pb = edgir.ValueExpr()
201201
pb.literal.array.SetInParent()
202202
for value in self.values:
@@ -218,7 +218,7 @@ def __init__(self, lower: FloatExpr, upper: FloatExpr):
218218
def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
219219
return chain(self.lower._get_exprs(), self.lower._get_exprs())
220220

221-
def expr_to_proto(self, expr: ConstraintExpr, ref_map: IdentityDict[Refable, edgir.LocalPath]) -> edgir.ValueExpr:
221+
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
222222
pb = edgir.ValueExpr()
223223
pb.binary.op = edgir.BinaryExpr.RANGE
224224
pb.binary.lhs.CopyFrom(self.lower._expr_to_proto(ref_map))
@@ -234,7 +234,7 @@ def __init__(self, values: Sequence[ConstraintExpr]):
234234
super().__init__()
235235
self.values = values
236236

237-
def expr_to_proto(self, expr: ConstraintExpr, ref_map: IdentityDict[Refable, edgir.LocalPath]) -> edgir.ValueExpr:
237+
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
238238
pb = edgir.ValueExpr()
239239
pb.array.SetInParent()
240240
for value in self.values:
@@ -267,7 +267,7 @@ def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
267267
return chain(self.src._get_exprs())
268268

269269
def expr_to_proto(self, expr: ConstraintExpr,
270-
ref_map: IdentityDict[Refable, edgir.LocalPath]) -> edgir.ValueExpr:
270+
ref_map: Refable.RefMapType) -> edgir.ValueExpr:
271271
pb = edgir.ValueExpr()
272272
pb.unary.op = self.op_map[self.op]
273273
pb.unary.val.CopyFrom(self.src._expr_to_proto(ref_map))
@@ -303,7 +303,7 @@ def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
303303
return chain(self.src._get_exprs())
304304

305305
def expr_to_proto(self, expr: ConstraintExpr,
306-
ref_map: IdentityDict[Refable, edgir.LocalPath]) -> edgir.ValueExpr:
306+
ref_map: Refable.RefMapType) -> edgir.ValueExpr:
307307
pb = edgir.ValueExpr()
308308
pb.unary_set.op = self.op_map[self.op]
309309
pb.unary_set.vals.CopyFrom(self.src._expr_to_proto(ref_map))
@@ -352,7 +352,7 @@ def __init__(self,
352352
def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
353353
return chain(self.lhs._get_exprs(), self.rhs._get_exprs())
354354

355-
def expr_to_proto(self, expr: ConstraintExpr, ref_map: IdentityDict[Refable, edgir.LocalPath]) -> edgir.ValueExpr:
355+
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
356356
pb = edgir.ValueExpr()
357357
pb.binary.op = self.op_map[self.op]
358358
pb.binary.lhs.CopyFrom(self.lhs._expr_to_proto(ref_map))
@@ -381,7 +381,7 @@ def __init__(self,
381381
def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
382382
return chain(self.lhset._get_exprs(), self.rhs._get_exprs())
383383

384-
def expr_to_proto(self, expr: ConstraintExpr, ref_map: IdentityDict[Refable, edgir.LocalPath]) -> edgir.ValueExpr:
384+
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
385385
pb = edgir.ValueExpr()
386386
pb.binary_set.op = self.op_map[self.op]
387387
pb.binary_set.lhset.CopyFrom(self.lhset._expr_to_proto(ref_map))
@@ -402,7 +402,7 @@ def __init__(self, cond: BoolExpr, then_val: ConstraintExpr, else_val: Constrain
402402
def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
403403
return chain(self.cond._get_exprs(), self.then_val._get_exprs(), self.else_val._get_exprs())
404404

405-
def expr_to_proto(self, expr: ConstraintExpr, ref_map: IdentityDict[Refable, edgir.LocalPath]) -> edgir.ValueExpr:
405+
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
406406
pb = edgir.ValueExpr()
407407
pb.ifThenElse.cond.CopyFrom(self.cond._expr_to_proto(ref_map))
408408
pb.ifThenElse.tru.CopyFrom(self.then_val._expr_to_proto(ref_map))
@@ -421,7 +421,7 @@ def __init__(self, src: Port):
421421
def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
422422
return [self.src]
423423

424-
def expr_to_proto(self, expr: ConstraintExpr, ref_map: IdentityDict[Refable, edgir.LocalPath]) -> edgir.ValueExpr:
424+
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
425425
pb = edgir.ValueExpr()
426426
pb.ref.CopyFrom(ref_map[self.src])
427427
pb.ref.steps.add().reserved_param = edgir.IS_CONNECTED
@@ -438,7 +438,7 @@ def __init__(self, src: Union[BaseBlock, BasePort]):
438438
def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
439439
return []
440440

441-
def expr_to_proto(self, expr: ConstraintExpr, ref_map: IdentityDict[Refable, edgir.LocalPath]) -> edgir.ValueExpr:
441+
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
442442
pb = edgir.ValueExpr()
443443
pb.ref.CopyFrom(ref_map[self.src])
444444
pb.ref.steps.add().reserved_param = edgir.NAME
@@ -456,7 +456,7 @@ def __init__(self, src: Vector):
456456
def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
457457
return [self.src]
458458

459-
def expr_to_proto(self, expr: ConstraintExpr, ref_map: IdentityDict[Refable, edgir.LocalPath]) -> edgir.ValueExpr:
459+
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
460460
pb = edgir.ValueExpr()
461461
pb.ref.CopyFrom(ref_map[self.src])
462462
pb.ref.steps.add().reserved_param = edgir.LENGTH
@@ -474,7 +474,7 @@ def __init__(self, src: Vector):
474474
def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
475475
return [self.src]
476476

477-
def expr_to_proto(self, expr: ConstraintExpr, ref_map: IdentityDict[Refable, edgir.LocalPath]) -> edgir.ValueExpr:
477+
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
478478
pb = edgir.ValueExpr()
479479
pb.ref.CopyFrom(ref_map[self.src])
480480
pb.ref.steps.add().reserved_param = edgir.ALLOCATED
@@ -484,7 +484,7 @@ def expr_to_proto(self, expr: ConstraintExpr, ref_map: IdentityDict[Refable, edg
484484
class AssignBinding(Binding):
485485
# Convenience method to make an assign expr without the rest of this proto infrastructure
486486
@staticmethod
487-
def make_assign(target: ConstraintExpr, value: ConstraintExpr, ref_map: IdentityDict[Refable, edgir.LocalPath]) -> edgir.ValueExpr:
487+
def make_assign(target: ConstraintExpr, value: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
488488
pb = edgir.ValueExpr()
489489
pb.assign.dst.CopyFrom(ref_map[target])
490490
pb.assign.src.CopyFrom(value._expr_to_proto(ref_map))
@@ -501,5 +501,5 @@ def __init__(self, target: ConstraintExpr, value: ConstraintExpr):
501501
def get_subexprs(self) -> Iterable[Union[ConstraintExpr, BasePort]]:
502502
return [self.value]
503503

504-
def expr_to_proto(self, expr: ConstraintExpr, ref_map: IdentityDict[Refable, edgir.LocalPath]) -> edgir.ValueExpr:
504+
def expr_to_proto(self, expr: ConstraintExpr, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
505505
return self.make_assign(self.target, self.value, ref_map)

edg/core/Blocks.py

Lines changed: 22 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -180,9 +180,14 @@ def make_connection(self) -> Optional[Union[ConnectedLink, Export]]:
180180
bridged_connects: List[Tuple[BasePort, edgir.LocalPath]] = []
181181
link_connects: List[Tuple[BasePort, edgir.LocalPath]] = []
182182
assert self.link_instance is not None
183-
link_ref_map = self.link_instance._get_ref_map_allocate(edgir.LocalPath())
183+
link_ref_map = self.link_instance._create_ref_map()
184184
for link_port, connected_ports in self.link_connected_ports.items():
185185
link_ref = link_ref_map[link_port]
186+
if isinstance(link_port, BaseVector):
187+
allocate_path = edgir.LocalPath()
188+
allocate_path.CopyFrom(link_ref)
189+
allocate_path.steps.append(edgir.LocalStep(allocate=''))
190+
link_ref = allocate_path
186191
for connected_port in connected_ports:
187192
bridged_port = self.bridged_ports.get(connected_port, None)
188193
if bridged_port is None: # direct connection, no bridge
@@ -214,14 +219,13 @@ class DescriptionString():
214219
def __init__(self, *elts: Union[str, DescriptionStringElts]):
215220
self.elts = elts
216221

217-
def add_to_proto(self, pb, ref_map):
222+
def add_to_proto(self, pb: edgir.BlockLikeTypes, ref_map: Refable.RefMapType):
218223
for elt in self.elts:
219224
if isinstance(elt, DescriptionStringElts):
220225
elt.set_elt_proto(pb, ref_map)
221226
elif isinstance(elt, str):
222227
new_phrase = pb.description.add()
223228
new_phrase.text = elt
224-
return pb
225229

226230
class FormatUnits(DescriptionStringElts):
227231
ref: ConstraintExpr
@@ -310,7 +314,7 @@ def _elaborated_def_to_proto(self) -> BaseBlockEdgirType:
310314

311315
return self._def_to_proto()
312316

313-
def _populate_def_proto_block_base(self, pb: BaseBlockEdgirType) -> BaseBlockEdgirType:
317+
def _populate_def_proto_block_base(self, pb: BaseBlockEdgirType) -> None:
314318
"""Populates the structural parts of a block proto: parameters, ports, superclasses"""
315319
assert self._elaboration_state == BlockElaborationState.post_contents or \
316320
self._elaboration_state == BlockElaborationState.post_generate
@@ -343,7 +347,7 @@ def _populate_def_proto_block_base(self, pb: BaseBlockEdgirType) -> BaseBlockEdg
343347
for (name, port) in self._ports.items():
344348
edgir.add_pair(pb.ports, name).CopyFrom(port._instance_to_proto())
345349

346-
ref_map = self._get_ref_map(edgir.LocalPath()) # TODO dedup ref_map
350+
ref_map = self._create_ref_map()
347351
for (name, port) in self._ports.items():
348352
if port in self._required_ports:
349353
if isinstance(port, Port):
@@ -359,58 +363,45 @@ def _populate_def_proto_block_base(self, pb: BaseBlockEdgirType) -> BaseBlockEdg
359363

360364
self._constraints.finalize() # needed for source locator generation
361365

362-
ref_map = self._get_ref_map(edgir.LocalPath())
363366
self._populate_metadata(pb.meta, self._metadata, ref_map)
364367

365-
return pb
366-
367-
def _populate_def_proto_port_init(self, pb: BaseBlockEdgirType) -> BaseBlockEdgirType:
368-
ref_map = self._get_ref_map(edgir.LocalPath()) # TODO dedup ref_map
369-
368+
def _populate_def_proto_port_init(self, pb: BaseBlockEdgirType, ref_map: Refable.RefMapType) -> None:
370369
for (name, port) in self._ports.items():
371370
for (param, path, initializer) in port._get_initializers([name]):
372371
edgir.add_pair(pb.constraints, f"(init){'.'.join(path)}").CopyFrom(
373372
AssignBinding.make_assign(param, param._to_expr_type(initializer), ref_map)
374373
)
375-
return pb
376374

377-
def _populate_def_proto_param_init(self, pb: BaseBlockEdgirType) -> BaseBlockEdgirType:
378-
ref_map = self._get_ref_map(edgir.LocalPath()) # TODO dedup ref_map
375+
def _populate_def_proto_param_init(self, pb: BaseBlockEdgirType, ref_map: Refable.RefMapType) -> None:
379376
for (name, param) in self._parameters.items():
380377
if param.initializer is not None:
381378
edgir.add_pair(pb.constraints, f'(init){name}').CopyFrom(
382379
AssignBinding.make_assign(param, param.initializer, ref_map)
383380
)
384-
return pb
385381

386-
def _populate_def_proto_block_contents(self, pb: BaseBlockEdgirType) -> BaseBlockEdgirType:
382+
def _populate_def_proto_block_contents(self, pb: BaseBlockEdgirType, ref_map: Refable.RefMapType) -> None:
387383
"""Populates the contents of a block proto: constraints"""
388384
assert self._elaboration_state == BlockElaborationState.post_contents or \
389385
self._elaboration_state == BlockElaborationState.post_generate
390386

391387
self._constraints.finalize()
392388

393-
ref_map = self._get_ref_map(edgir.LocalPath())
394-
395389
for (name, constraint) in self._constraints.items():
396390
edgir.add_pair(pb.constraints, name).CopyFrom(constraint._expr_to_proto(ref_map))
397391

398-
return pb
399-
400-
def _populate_def_proto_description(self, pb: BaseBlockEdgirType) -> BaseBlockEdgirType:
392+
def _populate_def_proto_description(self, pb: BaseBlockEdgirType, ref_map: Refable.RefMapType) -> None:
401393
description = self.description
402394
assert(description is None or isinstance(description, DescriptionString))
403395
if isinstance(description, DescriptionString):
404-
pb = description.add_to_proto(pb, self._get_ref_map(edgir.LocalPath()))
405-
406-
return pb
407-
408-
def _get_ref_map(self, prefix: edgir.LocalPath) -> IdentityDict[Refable, edgir.LocalPath]:
409-
return super()._get_ref_map(prefix) + IdentityDict(
410-
[(self.name(), edgir.localpath_concat(prefix, edgir.NAME))],
411-
*[param._get_ref_map(edgir.localpath_concat(prefix, name)) for (name, param) in self._parameters.items()],
412-
*[port._get_ref_map(edgir.localpath_concat(prefix, name)) for (name, port) in self._ports.items()]
413-
)
396+
description.add_to_proto(pb, ref_map)
397+
398+
def _build_ref_map(self, ref_map: Refable.RefMapType, prefix: edgir.LocalPath) -> None:
399+
super()._build_ref_map(ref_map, prefix)
400+
ref_map[self.name()] = edgir.localpath_concat(prefix, edgir.NAME)
401+
for name, param in self._parameters.items():
402+
param._build_ref_map(ref_map, edgir.localpath_concat(prefix, name))
403+
for name, port in self._ports.items():
404+
port._build_ref_map(ref_map, edgir.localpath_concat(prefix, name))
414405

415406
def _bind_in_place(self, parent: Union[BaseBlock, Port]):
416407
self._parent = parent

edg/core/ConstraintExpr.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ def _bind(self: SelfType, binding: Binding) -> SelfType:
9191
def _is_bound(self) -> bool:
9292
return self.binding is not None and self.binding.is_bound()
9393

94-
def _expr_to_proto(self, ref_map: IdentityDict[Refable, edgir.LocalPath]) -> edgir.ValueExpr:
94+
def _expr_to_proto(self, ref_map: Refable.RefMapType) -> edgir.ValueExpr:
9595
assert self.binding is not None
9696
return self.binding.expr_to_proto(self, ref_map)
9797

0 commit comments

Comments
 (0)