diff --git a/artiq/compiler/embedding.py b/artiq/compiler/embedding.py index 4f79bdfaaa..ec1b629e34 100644 --- a/artiq/compiler/embedding.py +++ b/artiq/compiler/embedding.py @@ -174,7 +174,7 @@ def _map(self, obj): self.inverse_rpc_map[obj_id] = self.next_rpc return self.next_rpc - def _iterate(self): + def finalize(self): inferencer = Inferencer(engine=self.engine) # Iterate inference to fixed point. @@ -414,4 +414,17 @@ def stitch_call(self, function, args, kwargs): synthesizer.finalize() self.typedtree.append(call_node) - self._iterate() + def finalize(self): + inferencer = Inferencer(engine=self.engine) + + # Iterate inference to fixed point. + self.inference_finished = False + while not self.inference_finished: + self.inference_finished = True + inferencer.visit(self.typedtree) + + # After we have found all functions, synthesize a module to hold them. + source_buffer = source.Buffer("", "") + self.typedtree = asttyped.ModuleT( + typing_env=self.globals, globals_in_scope=set(), + body=self.typedtree, loc=source.Range(source_buffer, 0, 0)) diff --git a/artiq/coredevice/core.py b/artiq/coredevice/core.py index 1adb1c9045..9408693b76 100644 --- a/artiq/coredevice/core.py +++ b/artiq/coredevice/core.py @@ -36,6 +36,7 @@ def compile(self, function, args, kwargs, with_attr_writeback=True): stitcher = Stitcher(engine=engine) stitcher.stitch_call(function, args, kwargs) + stitcher.finalize() module = Module(stitcher) target = OR1KTarget()