code: func dotNodelets(rpt *Report, rIndex int, n *node) (dot string) {
  	const maxNodelets = 4    // Number of nodelets for alphanumeric labels
  	const maxNumNodelets = 4 // Number of nodelets for numeric labels
  
  	var ts, nts tags
  	for _, t := range n.tags {
  		if t.unit == "" {
  			ts = append(ts, t)
  		} else {
  			nts = append(nts, t)
  		}
  	}
  
  	// Select the top maxNodelets alphanumeric labels by weight
  	sort.Sort(ts)
  	if len(ts) > maxNodelets {
  		ts = ts[:maxNodelets]
  	}
  	for i, t := range ts {
  		weight := rpt.formatValue(t.weight)
  		dot += fmt.Sprintf(`N%d_%d [label = "%s" fontsize=8 shape=box3d tooltip="%s"]`+"\n", rIndex, i, t.name, weight)
  		dot += fmt.Sprintf(`N%d -> N%d_%d [label=" %s" weight=100 tooltip="\L" labeltooltip="\L"]`+"\n", rIndex, rIndex, i, weight)
  	}
  
  	// Collapse numeric labels into maxNumNodelets buckets, of the form:
  	// 1MB..2MB, 3MB..5MB, ...
  	nts = collapseTags(nts, maxNumNodelets)
  	sort.Sort(nts)
  	for i, t := range nts {
  		weight := rpt.formatValue(t.weight)
  		dot += fmt.Sprintf(`NN%d_%d [label = "%s" fontsize=8 shape=box3d tooltip="%s"]`+"\n", rIndex, i, t.name, weight)
  		dot += fmt.Sprintf(`N%d -> NN%d_%d [label=" %s" weight=100 tooltip="\L" labeltooltip="\L"]`+"\n", rIndex, rIndex, i, weight)
  	}
  
  	return dot
  }
docs: // dotNodelets generates the DOT boxes for the node tags.