def dotFlowChartFromDependencies(processes, outputs, inputs=None):
    """Create a DOT-language GraphViz flowchart that depicts the process steps,
    the outputs of the flow, and the connecting lines.  Explicit processes are
    full nodes (style 'node') connected by simple edges, while implicit transforms
    are minor nodes drawn on a two-part edge (styles linkNode & linkEdge).
    """
    styles = {'node': ' [shape = box]', 'edge': ' ',
              'linkNode': ' [shape = box, style=dotted]', 'linkEdge': ' ',
              'terminal': ' [shape = ellipse, style=filled, color="gray89"]'}
    dot = ['digraph G {\n  size = "8,8";\n  rankdir = LR']
    # Add processes and their links to the graph
    for process in processes:
        name, type, deps = process
        if type == 'explicit':
            dot.append(name + styles['node'])
        else:   # type == 'implicit'
            dot.append(name + styles['linkNode'])
        if deps is None:
            continue
        for i in deps:
            edge = processes[i][0] + ' -> ' + name
            if type == 'implicit' or processes[i][1] == 'implicit':
                dot.append(edge + styles['linkEdge'])
            else:
                dot.append(edge + styles['edge'])

    # Add flow outputs to the graph
    for output in outputs:
        name, dep = output
        dot.append(name + styles['terminal'])
        if dep < 0:
            continue   # an flow output might come from the flow inputs, so no edge shown
        edge = processes[dep][0] + ' -> ' + name
        inputType = processes[dep][1]
        if inputType == 'implicit':
            dot.append(edge + styles['linkEdge'])
        else:
            dot.append(edge + styles['edge'])

    return ';\n  '.join(dot) + '\n}\n'