code: def add_nodes(self, nodes, nesting=1):
          
          hopNodes = set()  # nodes in this hop
          hopEdges = []     # edges in this hop
          # get nodes and edges for this hop
          for i, n in zip(range(len(nodes)), nodes):
              r, g, b = rainbowcolour(i, len(nodes))
              colour = '#%02X%02X%02X' % (r, g, b)
              for p in n.calls:
                  if p not in hopNodes:
                      hopNodes.add(p)
                  hopEdges.append((n, p, 'solid', colour))
              for p in getattr(n, 'interfaces', []):
                  if p not in hopNodes:
                      hopNodes.add(p)
                  hopEdges.append((n, p, 'dashed', colour))
          # add nodes, edges and attributes to the graph if maximum number of
          # nodes is not exceeded
          if self.add_to_graph(hopNodes, hopEdges, nesting):
              self.dot.attr('graph', size='11.875,1000.0')
              self.dot.attr('graph', concentrate='false')
docs: Adds edges indicating the call-tree for the procedures listed in
          the nodes.