Skip to main content
[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Hi
My presentation at York had one major flaw. It assumed that a call graph
built by considering producers and consumers of region heads was
satisfactory for both control and data flow. It isn't.
If A provides something for B (data flow), it is convenient to call B
from A (control flow). BUT if B has a further required value that A
cannot satisfy, the call of B must be deferred until the further
requirement of B is satisfied. A must therefore place its output in a
temporary buffer within a suitable ancestor until all the directly
referenced inputs of a B invocation are available. This problem for a
single headed input is the same as occurs for multi-headed input. The
solution can be therefore shared and is now on ewillink/480567, but one
test fails intermittently; bug partially understood.
QVTi does not support a mapping that executes by assigning to or
accumulating in a buffer. It is possible to fudge a "x : Set(X)" guard
variable and then do "x := x->union(more);" but it's a but klunky.
Better to introduce an updateable middle guard "where (x : Set(T))" that
can be updated by a bottom assignment "x += more;". The new form of an
assignment uses a new ConnectionAssignment AS class. The new form of
guard variable is distinctive since the middle/where guard had no
variables in QVTi.
The intermittency might be fixed today, but the general clean up and
review certainly won't be, so I'll try to cherry pick all the
ConnectionAssignment support changes for M4 so that M4 can be used as a
stable development platform for the new scheduler.
Regards
Ed Willink
Back to the top