11from typing import TypeVar , Union , List , Tuple , Dict , Type
22
33from .. import edgir
4+ from .Builder import builder
45from .Ports import Port
56from .ConstraintExpr import ConstraintExpr
67from .HdlUserExceptions import BlockDefinitionError
@@ -51,11 +52,16 @@ def multipack(self):
5152
5253 # TODO make this non-overriding? - this needs to call multipack after contents
5354 def _elaborated_def_to_proto (self ) -> edgir .HierarchyBlock :
54- assert self ._elaboration_state == BlockElaborationState .post_init
55- self ._elaboration_state = BlockElaborationState .contents
56- self .contents ()
57- self .multipack ()
58- self ._elaboration_state = BlockElaborationState .post_contents
55+ prev_element = builder .push_element (self )
56+ assert prev_element is None
57+ try :
58+ assert self ._elaboration_state == BlockElaborationState .post_init
59+ self ._elaboration_state = BlockElaborationState .contents
60+ self .contents ()
61+ self .multipack ()
62+ self ._elaboration_state = BlockElaborationState .post_contents
63+ finally :
64+ builder .pop_to (prev_element )
5965 return self ._def_to_proto ()
6066
6167 def _populate_def_proto_block_contents (self , pb : edgir .HierarchyBlock ) -> edgir .HierarchyBlock :
@@ -78,7 +84,7 @@ def _populate_def_proto_block_contents(self, pb: edgir.HierarchyBlock) -> edgir.
7884 else :
7985 raise TypeError
8086 assert isinstance (multipack_block , MultipackBlock )
81- multipack_name = self ._name_of_child (multipack_block )
87+ multipack_name = self ._name_of_child (multipack_block , self )
8288 multipack_ref_base = edgir .LocalPath ()
8389 multipack_ref_base .steps .add ().name = multipack_name
8490 multipack_ref_map = multipack_block ._get_ref_map (multipack_ref_base )
@@ -90,9 +96,9 @@ def _populate_def_proto_block_contents(self, pb: edgir.HierarchyBlock) -> edgir.
9096 packed_ref_map = multipack_part_block ._get_ref_map (packed_ref_base )
9197
9298 if isinstance (multipack_part , Block ):
93- part_name = multipack_block ._name_of_child (multipack_part )
99+ part_name = multipack_block ._name_of_child (multipack_part , self )
94100 elif isinstance (multipack_part , PackedBlockAllocate ):
95- part_name = multipack_block ._name_of_child (multipack_part .parent )
101+ part_name = multipack_block ._name_of_child (multipack_part .parent , self )
96102 assert multipack_part .suggested_name , "multipack parts must have suggested name, for consistency"
97103 part_name += f"[{ multipack_part .suggested_name } ]"
98104 else :
@@ -105,7 +111,7 @@ def _populate_def_proto_block_contents(self, pb: edgir.HierarchyBlock) -> edgir.
105111 packed_port_port = packed_port .port
106112 else :
107113 raise TypeError
108- packed_port_name = multipack_part_block ._name_of_child (packed_port_port )
114+ packed_port_name = multipack_part_block ._name_of_child (packed_port_port , self )
109115 exported_tunnel = edgir .add_pair (pb .constraints ,
110116 f"(packed){ multipack_name } .{ part_name } .{ packed_port_name } " ).exportedTunnel
111117 exported_tunnel .internal_block_port .ref .CopyFrom (multipack_ref_map [exterior_port ])
@@ -117,13 +123,13 @@ def _populate_def_proto_block_contents(self, pb: edgir.HierarchyBlock) -> edgir.
117123
118124 for multipack_param , packed_param in packing_rule .tunnel_assigns .items ():
119125 if isinstance (packed_param , ConstraintExpr ):
120- packed_param_name = multipack_part_block ._name_of_child (packed_param )
126+ packed_param_name = multipack_part_block ._name_of_child (packed_param , self )
121127 assign_tunnel = edgir .add_pair (pb .constraints ,
122128 f"(packed){ multipack_name } .{ part_name } .{ packed_param_name } " ).assignTunnel
123129 assign_tunnel .dst .CopyFrom (multipack_ref_map [multipack_param ])
124130 assign_tunnel .src .ref .CopyFrom (packed_ref_map [packed_param ])
125131 elif isinstance (packed_param , PackedBlockParamArray ):
126- multipack_param_name = multipack_block ._name_of_child (multipack_param )
132+ multipack_param_name = multipack_block ._name_of_child (multipack_param , self )
127133 constr_name = f"(packed){ multipack_name } .{ multipack_param_name } "
128134 packed_params .setdefault (constr_name , (multipack_ref_map [multipack_param ], []))[1 ].append (
129135 packed_ref_map [packed_param .param ])
@@ -132,14 +138,14 @@ def _populate_def_proto_block_contents(self, pb: edgir.HierarchyBlock) -> edgir.
132138
133139 for multipack_param , unpacked_param in packing_rule .tunnel_unpack_assigns .items ():
134140 if isinstance (unpacked_param , ConstraintExpr ):
135- multipack_param_name = multipack_block ._name_of_child (multipack_param )
141+ multipack_param_name = multipack_block ._name_of_child (multipack_param , self )
136142 # TODO need better constraint naming scheme
137143 assign_tunnel = edgir .add_pair (pb .constraints ,
138144 f"(unpacked){ multipack_name } .{ part_name } .{ multipack_param_name } " ).assignTunnel
139145 assign_tunnel .dst .CopyFrom (packed_ref_map [unpacked_param ])
140146 assign_tunnel .src .ref .CopyFrom (multipack_ref_map [multipack_param ])
141147 elif isinstance (unpacked_param , PackedBlockParam ):
142- multipack_param_name = multipack_block ._name_of_child (multipack_param )
148+ multipack_param_name = multipack_block ._name_of_child (multipack_param , self )
143149 # TODO need better constraint naming scheme
144150 assign_tunnel = edgir .add_pair (pb .constraints ,
145151 f"(unpacked){ multipack_name } .{ part_name } .{ multipack_param_name } " ).assignTunnel
0 commit comments