forked from M-Labs/artiq
compiler: refuse to embed a function from another core device.
Fixes #332.
This commit is contained in:
parent
82ab21dbd5
commit
78fa5becea
|
@ -448,7 +448,9 @@ class TypedtreeHasher(algorithm.Visitor):
|
|||
return hash(tuple(freeze(getattr(node, field_name)) for field_name in fields))
|
||||
|
||||
class Stitcher:
|
||||
def __init__(self, engine=None):
|
||||
def __init__(self, core, dmgr, engine=None):
|
||||
self.core = core
|
||||
self.dmgr = dmgr
|
||||
if engine is None:
|
||||
self.engine = diagnostic.Engine(all_errors_are_fatal=True)
|
||||
else:
|
||||
|
@ -473,7 +475,7 @@ class Stitcher:
|
|||
|
||||
# We synthesize source code for the initial call so that
|
||||
# diagnostics would have something meaningful to display to the user.
|
||||
synthesizer = self._synthesizer()
|
||||
synthesizer = self._synthesizer(self._function_loc(function.artiq_embedded.function))
|
||||
call_node = synthesizer.call(function_node, args, kwargs, callback)
|
||||
synthesizer.finalize()
|
||||
self.typedtree.append(call_node)
|
||||
|
@ -752,6 +754,17 @@ class Stitcher:
|
|||
notes=[note])
|
||||
self.engine.process(diag)
|
||||
|
||||
if self.dmgr.get(function.artiq_embedded.core_name) != self.core:
|
||||
note = diagnostic.Diagnostic("note",
|
||||
"called from this function", {},
|
||||
loc)
|
||||
diag = diagnostic.Diagnostic("fatal",
|
||||
"this function runs on a different core device '{name}'",
|
||||
{"name": function.artiq_embedded.core_name},
|
||||
self._function_loc(function.artiq_embedded.function),
|
||||
notes=[note])
|
||||
self.engine.process(diag)
|
||||
|
||||
# Insert the typed AST for the new function and restart inference.
|
||||
# It doesn't really matter where we insert as long as it is before
|
||||
# the final call.
|
||||
|
|
|
@ -31,7 +31,7 @@ def main():
|
|||
def embed():
|
||||
experiment = testcase_vars["Benchmark"](dmgr)
|
||||
|
||||
stitcher = Stitcher()
|
||||
stitcher = Stitcher(core=experiment.core, dmgr=dmgr)
|
||||
stitcher.stitch_call(experiment.run, (experiment,), {})
|
||||
stitcher.finalize()
|
||||
return stitcher
|
||||
|
|
|
@ -67,6 +67,7 @@ class Core:
|
|||
self.comm = dmgr.get(comm_device)
|
||||
|
||||
self.first_run = True
|
||||
self.dmgr = dmgr
|
||||
self.core = self
|
||||
self.comm.core = self
|
||||
|
||||
|
@ -74,7 +75,7 @@ class Core:
|
|||
try:
|
||||
engine = _DiagnosticEngine(all_errors_are_fatal=True)
|
||||
|
||||
stitcher = Stitcher(engine=engine)
|
||||
stitcher = Stitcher(engine=engine, core=self, dmgr=self.dmgr)
|
||||
stitcher.stitch_call(function, args, kwargs, set_result)
|
||||
stitcher.finalize()
|
||||
|
||||
|
|
Loading…
Reference in New Issue