Skip to content

Commit 74318b0

Browse files
nachumgamykyta3
authored andcommitted
Remove string-comparisons from Component _copy_for_inst.
Provides 25% speed improvement to compiler-speed for large projects with > 1M registers.
1 parent f3116f2 commit 74318b0

File tree

1 file changed

+41
-26
lines changed

1 file changed

+41
-26
lines changed

src/systemrdl/component.py

Lines changed: 41 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
ComponentClass = TypeVar('ComponentClass', bound='Component')
1414
AddressableComponentClass = TypeVar('AddressableComponentClass', bound='AddressableComponent')
15+
VectorComponentClass = TypeVar('VectorComponentClass', bound='VectorComponent')
1516

1617
class Component:
1718
"""
@@ -125,14 +126,16 @@ def _copy_for_inst(self: 'ComponentClass', memo: Dict[int, Any], recursive: bool
125126
result = cls.__new__(cls)
126127
memo[id(self)] = result
127128

128-
# Copy all parameter objects so that they can accept value overrides
129+
# Shallow-copy parameter objects so that they can accept value overrides
129130
result.parameters_dict = OrderedDict()
130131
for name, param in self.parameters_dict.items():
131132
result.parameters_dict[name] = copy(param)
132133

133-
# Copy the dicts to ensure they remain distinct
134+
# Shallow-copy the dicts to ensure they remain distinct
134135
result.properties = self.properties.copy()
135136
result.property_src_ref = self.property_src_ref.copy()
137+
result._dyn_assigned_props = copy(self._dyn_assigned_props)
138+
result._dyn_assigned_children = copy(self._dyn_assigned_children)
136139

137140
if recursive:
138141
# Recurse this special copy method for children
@@ -143,28 +146,16 @@ def _copy_for_inst(self: 'ComponentClass', memo: Dict[int, Any], recursive: bool
143146
# to a DPA assignment
144147
result.children = self.children
145148

146-
# Finally, deepcopy everything else
147-
copy_by_ref = {
148-
"original_def", "parent_scope", "comp_defs",
149-
"def_src_ref", "inst_src_ref",
150-
151-
# Hack: these exist in sub-classes, but easier to just list them here
152-
# rather than extending this function
153-
"width", "msb", "lsb", "high", "low",
154-
"addr_offset", "addr_align",
155-
"array_stride",
156-
}
157-
skip = {
158-
"parameters_dict", "properties", "children", "property_src_ref",
159-
"array_dimensions",
160-
}
161-
for k, v in self.__dict__.items():
162-
if k in skip:
163-
continue
164-
if k in copy_by_ref:
165-
setattr(result, k, v)
166-
else:
167-
setattr(result, k, deepcopy(v, memo))
149+
# Copy by reference.
150+
result.parent_scope = self.parent_scope
151+
result._scope_name = self._scope_name
152+
result.type_name = self.type_name
153+
result.def_src_ref = self.def_src_ref
154+
result.is_instance = self.is_instance
155+
result.inst_name = self.inst_name
156+
result.original_def = self.original_def
157+
result.external = self.external
158+
result.inst_src_ref = self.inst_src_ref
168159

169160
return result
170161

@@ -284,11 +275,13 @@ def __init__(self) -> None:
284275
#: If left as None, compiler will resolve with inferred value.
285276
self.array_stride: Optional[int] = None
286277

287-
288278
def _copy_for_inst(self: 'AddressableComponentClass', memo: Dict[int, Any], recursive: bool = False) -> 'AddressableComponentClass':
289279
result = super()._copy_for_inst(memo, recursive)
290-
280+
result.addr_offset = self.addr_offset
281+
result.addr_align = self.addr_align
282+
result.is_array = self.is_array
291283
result.array_dimensions = copy(self.array_dimensions)
284+
result.array_stride = self.array_stride
292285
return result
293286

294287

@@ -342,6 +335,15 @@ def __init__(self) -> None:
342335
#: Low index of bit range
343336
self.low: int = None # type: ignore
344337

338+
def _copy_for_inst(self: 'VectorComponentClass', memo: Dict[int, Any], recursive: bool = False) -> 'VectorComponentClass':
339+
result = super()._copy_for_inst(memo, recursive)
340+
result.width = self.width
341+
result.msb = self.msb
342+
result.lsb = self.lsb
343+
result.high = self.high
344+
result.low = self.low
345+
return result
346+
345347

346348
class VectorComponent_PreExprElab(VectorComponent):
347349
"""
@@ -363,6 +365,11 @@ def __init__(self) -> None:
363365
#: the global root scope.
364366
self.comp_defs: Dict[str, Component] = OrderedDict()
365367

368+
def _copy_for_inst(self: 'Root', memo: Dict[int, Any], recursive: bool = False) -> 'Root':
369+
result = super()._copy_for_inst(memo, recursive)
370+
result.comp_defs = copy(self.comp_defs)
371+
return result
372+
366373
class Signal(VectorComponent):
367374
original_def: Optional['Signal']
368375

@@ -417,6 +424,14 @@ def __init__(self) -> None:
417424
#: instance
418425
self.alias_primary_inst: Optional[Reg] = None
419426

427+
def _copy_for_inst(self: 'Reg', memo: Dict[int, Any], recursive: bool = False) -> 'Reg':
428+
result = super()._copy_for_inst(memo, recursive)
429+
result.is_msb0_order = self.is_msb0_order
430+
result._alias_names = copy(self._alias_names)
431+
result.is_alias = self.is_alias
432+
result.alias_primary_inst = deepcopy(self.alias_primary_inst, memo)
433+
return result
434+
420435
class Regfile(AddressableComponent):
421436
original_def: Optional['Regfile']
422437

0 commit comments

Comments
 (0)