diff --git a/b_asic/signal_flow_graph.py b/b_asic/signal_flow_graph.py index 3b1d530b866a35a198ea374400e8ac8c7f1257cb..8823929f84656a23f011866cb4e0364a50d6347a 100644 --- a/b_asic/signal_flow_graph.py +++ b/b_asic/signal_flow_graph.py @@ -31,10 +31,14 @@ class GraphIDGenerator: """Construct a GraphIDGenerator.""" self._next_id_number = defaultdict(lambda: id_number_offset) - def next_id(self, type_name: TypeName) -> GraphID: + def next_id(self, type_name: TypeName, used_ids: MutableSet = set()) -> GraphID: """Get the next graph id for a certain graph id type.""" self._next_id_number[type_name] += 1 - return type_name + str(self._next_id_number[type_name]) + new_id = type_name + str(self._next_id_number[type_name]) + while (new_id in used_ids): + self._next_id_number[type_name] += 1 + new_id = type_name + str(self._next_id_number[type_name]) + return new_id @property def id_number_offset(self) -> GraphIDNumber: @@ -89,6 +93,7 @@ class SFG(AbstractOperation): name=name, input_sources=input_sources) self._components_by_id = dict() + self._used_ids = set() self._components_by_name = defaultdict(list) self._components_dfs_order = [] self._operations_dfs_order = [] @@ -101,6 +106,7 @@ class SFG(AbstractOperation): self._original_output_signals_to_indices = {} self._precedence_list = None + # Setup input signals. if input_signals is not None: for input_index, signal in enumerate(input_signals): @@ -688,9 +694,10 @@ class SFG(AbstractOperation): assert original_component not in self._original_components_to_new, "Tried to add duplicate SFG component" new_component = original_component.copy_component() self._original_components_to_new[original_component] = new_component - if not new_component.graph_id or new_component.graph_id in self._components_by_id: - new_id = self._graph_id_generator.next_id(new_component.type_name()) + if not new_component.graph_id or new_component.graph_id in self._used_ids: + new_id = self._graph_id_generator.next_id(new_component.type_name(), self._used_ids) new_component.graph_id = new_id + self._used_ids.add(new_component.graph_id) self._components_by_id[new_component.graph_id] = new_component self._components_by_name[new_component.name].append(new_component) return new_component