vmomap: sketching it out

Change-Id: I85b6da7045bfb29513d680df0eb254c49c96a6b0
diff --git a/memory/vmomap.py b/memory/vmomap.py
new file mode 100755
index 0000000..a7429cf
--- /dev/null
+++ b/memory/vmomap.py
@@ -0,0 +1,84 @@
+#!/usr/bin/env python
+#
+# Copyright 2017 The Fuchsia Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Visualizes the VMO/process graph from Magenta's "memgraph" tool.
+
+Run "vmomap.py --help" for a list of arguments.
+
+For usage, see magenta/docs/memory.md
+"""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+import json
+import sys
+
+
+class DirectedEdge(object):
+    """A generic directed edge in a directed graph."""
+
+    def __init__(self, head, tail):
+        """Creates a directed edge from the head to the tail.
+
+        Args:
+            head: the DagNode at the head (origin) of the edge
+            tail: the DagNode at the tail (destination) of the edge
+        """
+        self.head = head
+        self.tail = tail
+
+
+class DirectedNode(object):
+    """A generic node in a directed graph."""
+
+    def __init__(self, name, area=0):
+        """Creates a named node.
+
+        Args:
+            name: human-readable name of the node
+            area: a numeric size for the node; typically maps to memory size
+        """
+        #xxx unique id? or our parent container has it as a key?
+        #DirectedGraph.AddNode(id, name, area)
+        self.name = name
+        self.area = area
+        self.edges_in = []  #xxx set?
+        self.edges_out = []  #xxx set?
+        self.labels = set() # strings
+
+
+def build_vmo_proc_graph(dataset):
+    for record in dataset:
+        record_type = record['type']
+        if record_type != 'p':
+            continue
+
+
+def main():
+    dataset = json.load(sys.stdin)
+    # we only care about vmos and processes, but jobs help group
+    # can label each node with the spheres it's in (job-job-process)
+    # no nodes for jobs per se, unless we want the name
+    # ignore jobs at first
+
+    # start with clusters of vmos that have the same set of processes
+    # pointing to them.
+    # Ignore handle vs. mapping at first, though could add that to
+    # the process label on the vmo
+
+    # process node, vmo node
+    # edge labels on vmos; backlinks on processes
+    #  edges have via (mapping, handle+rights)
+
+    # also have clone tree
+    #  parent/child edges
+    # ignore this at first, too
+
+
+if __name__ == '__main__':
+    main()