code: func (g *marshalGraph) Dot(opts *DotOpts) []byte {
  	if opts == nil {
  		opts = &DotOpts{
  			DrawCycles: true,
  			MaxDepth:   -1,
  			Verbose:    true,
  		}
  	}
  
  	var w indentWriter
  	w.WriteString("digraph {\n")
  	w.Indent()
  
  	// some dot defaults
  	w.WriteString(`compound = "true"` + "\n")
  	w.WriteString(`newrank = "true"` + "\n")
  
  	// the top level graph is written as the first subgraph
  	w.WriteString(`subgraph "root" {` + "\n")
  	g.writeBody(opts, &w)
  
  	// cluster isn't really used other than for naming purposes in some graphs
  	opts.cluster = opts.MaxDepth != 0
  	maxDepth := opts.MaxDepth
  	if maxDepth == 0 {
  		maxDepth = -1
  	}
  
  	for _, s := range g.Subgraphs {
  		g.writeSubgraph(s, opts, maxDepth, &w)
  	}
  
  	w.Unindent()
  	w.WriteString("}\n")
  	return w.Bytes()
  }
docs: // Returns the DOT representation of this Graph.