1212
1313 ComponentClass = TypeVar ('ComponentClass' , bound = 'Component' )
1414 AddressableComponentClass = TypeVar ('AddressableComponentClass' , bound = 'AddressableComponent' )
15+ VectorComponentClass = TypeVar ('VectorComponentClass' , bound = 'VectorComponent' )
1516
1617class 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
346348class 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+
366373class 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+
420435class Regfile (AddressableComponent ):
421436 original_def : Optional ['Regfile' ]
422437
0 commit comments