Task Oriented Flows

Summary of procedures reviewed in this section:
Procedure
Description
PARALLEL
The tasks described within the script are to be considered parallel, meaning that they can be executed in any order and also concurrently.
SERIAL
The tasks described within the script are to be executed in the specified order.
TASK
Describe a task in a SERIAL or PARALLEL context

Keep it Simple

The idea behind the flows using parallel and serial tasks is to allow quick implementation of simple flows. These flows are based on a serial/parallel description of the relationships between tasks. It is the user's responsibility to make sure that such relationships are correct. Although these flows do not use any form of Tool Integration, they still offer visualization, resource management, and parallel execution of tasks. These flows are not the most efficient that can be written, but may be an easy way to begin using FlowTracer.

Here are some examples of task-oriented flows:
SERIAL {
    TASK ./configure
    TASK make clean
    TASK make install
}

PARALLEL {
    foreach dir { dir1 dir2 dir3 } {
        indir $dir {
            TASK make install
        }   
    }
}
SERIAL and PARALLEL can be deeply nested and are fully compatible with all other FDL directives including S, J , T, etc, as in this example:
PARALLEL {
    foreach dir { dir1 dir2 dir3 } {
        indir $dir {
            SERIAL {
                TASK make clean
                TASK make install
                S "PostInstall" {
                    PARALLEL {
                        J vw run_script1.csh
                        T vw run_script2.csh
                    }
                }
            }
        }   
    }
}
or in this other example of File: TaskComplex.tcl:
PARALLEL {
    SERIAL {
	N "PS1"
	TASK cal 2001
	TASK cal 2002
	TASK cal 2003
	TASK cal 2004
    }
    SERIAL {
	N "PS2"
	TASK cal 2011
	TASK cal 2012
	TASK cal 2013
	TASK cal 2014
    }
}

Adding Resources

Regular FDL procedures can be used to enhance the TASK oriented flows. For example, the procedure R can be used to specify the resource requirements for a task (and all subsequent tasks):
SERIAL {
    R "License:Synthesis RAM/2000"
    TASK doSynthesis ALU
    foreach test $listOfTests {
        R "License:Simulator RAM/1500"
        TASK doSimulation ALU $test
    }
}

Using S (setname) and N (name)

In the following flow, you can see the use of S to collect the tasks in this flow into a set and the use of N to give names to each task.
S "MainTasks" {
    SERIAL {
        R "pseudotasks !unix"
        N "Builds"
        TASK vsr -set "All:vovbuild"

        N "Headers"
        TASK vsr -cb -f -recompute -set All:include -timeout 30m

        N "Libraries"
        TASK vsr -cb -f -recompute -set All:libraries -timeout 30m

        N "AllTheRest" 
        TASK vsr -all -nowait
    }
}