Skip to content

Commit 357e227

Browse files
committed
Mangle function names with their node id due to spec ambiguity about name uniqueness.
1 parent caa1138 commit 357e227

File tree

1 file changed

+16
-12
lines changed

1 file changed

+16
-12
lines changed

hugr-py/src/hugr/model/export.py

+16-12
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@ def export_node(self, node: Node) -> Optional[model.Node]:
9595
)
9696

9797
case FuncDefn() as op:
98-
symbol = self.export_symbol(op.f_name, op.signature.params, op.signature.body)
98+
name = _mangle_name(node, op.f_name)
99+
symbol = self.export_symbol(name, op.signature.params, op.signature.body)
99100
region = self.export_region_dfg(node)
100101

101102
return model.Node(
@@ -104,7 +105,8 @@ def export_node(self, node: Node) -> Optional[model.Node]:
104105
)
105106

106107
case FuncDecl() as op:
107-
symbol = self.export_symbol(op.f_name, op.signature.params, op.signature.body)
108+
name = _mangle_name(node, op.f_name)
109+
symbol = self.export_symbol(name, op.signature.params, op.signature.body)
108110
return model.Node(
109111
operation = model.DeclareFunc(symbol),
110112
)
@@ -399,16 +401,16 @@ def export_symbol(
399401
params = []
400402

401403
for i, param_type in enumerate(param_types):
402-
name = str(i)
404+
param_name = str(i)
403405

404406
params.append(model.Param(
405-
name = name,
407+
name = param_name,
406408
type = param_type.to_model()
407409
))
408410

409411
match param_type:
410412
case TypeTypeParam(bound = TypeBound.Copyable):
411-
constraints.append(model.Apply("core.nonlinear", [model.Var(name)]))
413+
constraints.append(model.Apply("core.nonlinear", [model.Var(param_name)]))
412414
case _:
413415
pass
414416

@@ -432,12 +434,14 @@ def find_func_input(self, node: Node) -> Optional[str]:
432434

433435
match self.hugr[func_node].op:
434436
case FuncDecl() as func_op:
435-
return func_op.f_name
437+
name = func_op.f_name
436438
case FuncDefn() as func_op:
437-
return func_op.f_name
439+
name = func_op.f_name
438440
case _:
439441
return None
440442

443+
return _mangle_name(node, name)
444+
441445
def find_const_input(self, node: Node) -> Optional[model.Term]:
442446
try:
443447
const_node = next(
@@ -455,6 +459,11 @@ def find_const_input(self, node: Node) -> Optional[model.Term]:
455459
case op:
456460
return None
457461

462+
def _mangle_name(node: Node, name: str) -> str:
463+
# Until we come to an agreement on the uniqueness of names, we mangle the names
464+
# by adding the node id.
465+
return f"_{name}_{node.idx}"
466+
458467
class UnionFind[T]:
459468
def __init__(self):
460469
self.parents: dict[T, T] = {}
@@ -486,8 +495,3 @@ def union(self, a: T, b: T):
486495

487496
self.parents[b] = a
488497
self.sizes[a] += self.sizes[b]
489-
490-
491-
# def find_static_input(hugr: Hugr, node: Node) -> Optional[Node]:
492-
# for (in_port, out_ports) in hugr.incoming_links(node):
493-
# if hugr.port_kind(in_port) == Function

0 commit comments

Comments
 (0)