ABCDEFG (Asynchronous Buffered Computation Design and Engineering Framework Generator), which we shorten to FG and pronounce "effigy," is a programming environment for pipeline-structured programs. Such programs pass buffers among asynchronous stages, so that while one stage accesses high-latency data, other stages can make progress. You can download FG version 2.0 from this page.
FG is a programming environment for asynchronous programs that run on clusters and fit into a pipeline framework. It enables the programmer to write a series of synchronous functions and represents them as stages of an asynchronous pipeline. FG mitigates the high latency inherent in interprocessor communication and accessing the outer levels of the memory hierarchy. It overlaps separate pipeline stages that perform communication, computation, and I/O by running the stages asynchronously. Each stage maps to a thread. Buffers, whose sizes correspond to block sizes in the memory hierarchy, traverse the pipeline. FG makes such programs easier to write, smaller, and faster.
Version 1.x of FG provided a framework to develop software pipelines. Version 2.0 provides a more general framework to develop software networks that allow for a more elegant and concise description of computations. FG's basic unit of data is the buffer, which flows through a network consisting of a set of stages.
To construct an FG 2.0 network, the application programmer must instantiate a set of stages, each of whose functionality is specified in a stage definition (contained within a loadable module---writing stage definitions will be covered later). A stage definition specifies input pins and output pins for that stage; to create the network, input pins must be connected to output pins. Any unconnected input pins are assumed to be buffer sources and any unconnected output pins are assumed to be buffer sinks.
A stage operates by accepting buffers from input pins, performing computation, and conveying buffers along output pins. A buffer conveyed along an output pin is automatically enqueued on the connected input pin. If the output pin is a buffer sink, the buffer is automatically recycled back to the pin on which it entered the network.
Buffers are created when the pipeline is fixed. The default number and size of buffers are defined on a network-wide level, but can be overridden on a per-pin basis.
Pin arrays allow a stage definition to be written without knowing exactly how many inputs or output it will have. This is especially useful for, e.g., a stage implementing merge sort.
To expedite development, the application programmer may want to create a single network, duplicate it, modify it, and then combine the two. These operations are allowed.