// This graph contains the module dependencies of the partial evaluator
digraph G
{
  size = "11,8";
  nodesep = .1;
  ranksep = .5;

  // program nodes
  { rank=same;
    peval;
    TestDriver;
  }
  { rank=same;
    PeLetRW;
    PeNatural;
    PeRLNT;
    Abstract;
    Renaming;
    PostUnfold;
    NameChange;
  }
  { rank=same;
    Heap;
    NDState;
    State;
  }
  Configuration;
  FlatCurry;
  FlatCurryGoodies;
  FlatCurryPretty;
  Instance;
  Normalization;
  Output;
  PevalBase;
  PevalOpts;
  Subst;

  // utility nodes + edges
  node[style=filled, color=gray];
  { rank=same;
    GetOpt2;
    Pretty2;
    Set;
    Utils;
  }

  Abstract -> Pretty2;
  Abstract -> Utils;
  FlatCurryGoodies -> Utils;
  FlatCurryPretty -> Pretty2;
  GetOpt2 -> Utils;
  Heap -> Pretty2;
  Instance -> Pretty2;
  Instance -> Utils;
  Normalization -> Utils;
  PeLetRW -> Pretty2;
  PeNatural -> Pretty2;
  PeNatural -> Set;
  PeNatural -> Utils;
  PeRLNT -> Pretty2;
  peval -> Pretty2;
  PevalBase -> Pretty2;
  PevalOpts -> GetOpt2;
  PevalOpts -> Utils;
  PostUnfold -> Pretty2;
  PostUnfold -> Utils;
  Renaming -> Pretty2;
  Renaming -> Utils;
  Subst -> Pretty2;
  Subst -> Utils;
  TestDriver -> GetOpt2;
  TestDriver -> Utils;

  // program edges

  Abstract -> FlatCurry;
  Abstract -> FlatCurryGoodies;
  Abstract -> FlatCurryPretty;
  Abstract -> Instance;
  Abstract -> Normalization;
  Abstract -> Output;
  Abstract -> PevalOpts;
  Abstract -> Subst;

  FlatCurryGoodies -> FlatCurry;

  FlatCurryPretty -> FlatCurry;

  Heap -> FlatCurry;
  Heap -> FlatCurryGoodies;
  Heap -> FlatCurryPretty;

  Instance -> FlatCurry;
  Instance -> FlatCurryGoodies;
  Instance -> FlatCurryPretty;
  Instance -> Normalization;
  Instance -> Output;
  Instance -> Subst;

  NameChange -> FlatCurry;
  NameChange -> PevalBase;

  Normalization -> FlatCurry;
  Normalization -> FlatCurryGoodies;
  Normalization -> Output;
  Normalization -> PevalBase;
  Normalization -> Subst;

  Output -> PevalOpts;

  PeLetRW -> FlatCurry;
  PeLetRW -> FlatCurryGoodies;
  PeLetRW -> FlatCurryPretty;
  PeLetRW -> Normalization;
  PeLetRW -> Output;
  PeLetRW -> PevalOpts;
  PeLetRW -> State;
  PeLetRW -> Subst;

  PeNatural -> FlatCurry;
  PeNatural -> FlatCurryGoodies;
  PeNatural -> FlatCurryPretty;
  PeNatural -> Heap;
  PeNatural -> NDState;
  PeNatural -> Normalization;
  PeNatural -> Output;
  PeNatural -> PevalOpts;
  PeNatural -> Subst;

  PeRLNT -> FlatCurry;
  PeRLNT -> FlatCurryGoodies;
  PeRLNT -> FlatCurryPretty;
  PeRLNT -> Normalization;
  PeRLNT -> Output;
  PeRLNT -> PevalOpts;
  PeRLNT -> State;
  PeRLNT -> Subst;

  peval -> Abstract;
  peval -> FlatCurry;
  peval -> FlatCurryGoodies;
  peval -> FlatCurryPretty;
  peval -> NameChange;
  peval -> Normalization;
  peval -> Output;
  peval -> PeLetRW;
  peval -> PeNatural;
  peval -> PeRLNT;
  peval -> PevalBase;
  peval -> PevalOpts;
  peval -> PostUnfold;
  peval -> Renaming;

  PevalBase -> FlatCurry;
  PevalBase -> FlatCurryGoodies;
  PevalBase -> FlatCurryPretty;

  PevalOpts -> Configuration;

  PostUnfold -> FlatCurry;
  PostUnfold -> FlatCurryGoodies;
  PostUnfold -> FlatCurryPretty;
  PostUnfold -> NameChange;
  PostUnfold -> Normalization;
  PostUnfold -> Output;
  PostUnfold -> PevalBase;
  PostUnfold -> PevalOpts;

  Renaming -> FlatCurry;
  Renaming -> FlatCurryGoodies;
  Renaming -> FlatCurryPretty;
  Renaming -> Instance;
  Renaming -> Normalization;
  Renaming -> Output;
  Renaming -> PevalBase;
  Renaming -> PevalOpts;
  Renaming -> Subst;

  Subst -> FlatCurry;
  Subst -> FlatCurryGoodies;
  Subst -> FlatCurryPretty;
  Subst -> Output;

  TestDriver -> Configuration;
}
