Modified og_gui_manager.py to make it accessible on devices not on the efabless platform. Changed the create project script to make the proper config directories so that the editors can be used. Modified profile.py to make the settings properly reflect the user preferences.
diff --git a/common/foundry_nodes.py b/common/foundry_nodes.py
new file mode 100755
index 0000000..b431eff
--- /dev/null
+++ b/common/foundry_nodes.py
@@ -0,0 +1,131 @@
+#!/usr/bin/python
+
+# foundry_nodes.py ---
+#
+# This script runs in cloudV and discovers the set of foundry-
+# node names that are on the system and which support digital
+# synthesis.  It returns the list of discovered nodes in JSON
+# data format (output to stdout).
+#
+# Note that as this runs on the cloudV server, it is written
+# in python 2.7 syntax
+
+from __future__ import print_function
+
+import os
+import re
+import sys
+import json
+import glob
+
+def print_usage():
+     print('Usage: foundry_nodes.py [all|<tag>]')
+
+if __name__ == '__main__':
+    arguments = []
+    for item in sys.argv[1:]:
+        arguments.append(item)
+
+    dolist = 'active'
+    if len(arguments) == 1:
+        dolist = arguments[0]
+    elif len(arguments) != 0:
+        print_usage()
+        sys.exit(0)
+
+    # Search the /ef/ tree and find all foundry name (root name of the
+    # directory above the foundry node name).  If nothing is found,
+    # assume that this is the project name.  If the project name
+    # is already set, then generate an error.
+
+    proclist = []
+
+    for procnode in glob.glob('/ef/tech/*/*/.ef-config/nodeinfo.json'):
+        try:
+            with open(procnode, 'r') as ifile:
+                process = json.load(ifile)
+        except:
+            pass
+        else:
+            nodename = process['node']
+            rootpath = os.path.split(procnode)[0]
+            techroot = os.path.realpath(rootpath + '/techdir')
+            qflowlist = glob.glob(techroot + '/libs.tech/qflow/' + nodename + '*.sh')
+
+            
+            if 'status' in process:
+                status = process['status']
+            else:
+                # Default behavior is that nodes with "LEGACY" in the name
+                # are inactive, and all others are active.
+                if 'LEGACY' in nodename:
+                    status = 'legacy'
+                else:
+                    status = 'active'
+
+            # Do not record process nodes that do not match the status-match
+            # argument (unless the argument is "all").
+            if dolist != 'all':
+                if status != dolist:
+                    continue
+
+            # Try to find available standard cell sets if they are not marked
+            # as an entry in the nodeinfo.json file.  If they are an entry in nodeinfo.json,
+            # check if it is just a list of names.  If so, look up each name entry and
+            # expand it into a dictionary.  If it is already a dictionary, then just copy
+            # it to the output.
+            validcells = []
+            if 'stdcells' in process:
+                for name in process['stdcells'][:]:
+                    if type(name) is not dict:
+                        process['stdcells'].remove(name)
+                        validcells.append(name)
+
+            stdcells = []
+            for qflowdefs in qflowlist:
+                stdcellname = os.path.split(qflowdefs)[1]
+                validname = os.path.splitext(stdcellname)[0]
+                if validcells == [] or validname in validcells:
+
+                    stdcelldef = {}
+                    stdcelldef['name'] = validname
+
+                    # Read the qflow .sh file for the name of the preferred liberty format
+                    # file and the name of the verilog file.  Pull the path name from the
+                    # verilog file since there may be other supporting files that need to
+                    # be read from that path.
+
+                    # Diagnostic
+                    # print("Reading file " + qflowdefs, file=sys.stderr)
+                    with open(qflowdefs, 'r') as ifile:
+                        nodevars = ifile.read().splitlines()
+
+                    try:
+                        libline = next(item for item in nodevars if 'libertyfile' in item and item.strip()[0] != '#')
+                        lfile = libline.split('=')[1].strip()
+                        lfile = lfile.split()[0]
+                        stdcelldef['libertyfile'] = lfile
+                    except:
+                        pass
+
+                    try:
+                        vlgline = next(item for item in nodevars if 'verilogfile' in item and item.strip()[0] != '#')
+                        vfile = vlgline.split('=')[1].strip()
+                        vfile = vfile.split()[0]
+                        if os.path.exists(vfile):
+                            stdcelldef['verilogpath'] = os.path.split(vfile)[0]
+                        else:
+                            print("Warning:  bad verilogfile path " + vfile, file=sys.stderr)
+                    except:
+                        pass
+    
+                    stdcells.append(stdcelldef)
+
+            process['stdcells'] = stdcells
+            proclist.append(process)
+
+    if len(proclist) > 0:
+        json.dump(proclist, sys.stdout, indent=4)
+    else:
+        print("Error, no process nodes found!", file=sys.stderr)
+