diff --git a/common/symbolbuilder.py b/common/symbolbuilder.py
new file mode 100755
index 0000000..7a38781
--- /dev/null
+++ b/common/symbolbuilder.py
@@ -0,0 +1,103 @@
+#!/ef/efabless/opengalaxy/venv/bin/python3
+#
+#--------------------------------------------------------
+# Symbol Builder for the Open Galaxy project manager
+#
+#--------------------------------------------------------
+# Written by Tim Edwards
+# efabless, inc.
+# September 21, 2016
+# Version 0.1
+#--------------------------------------------------------
+
+import tkinter
+from tkinter import ttk
+
+class SymbolBuilder(tkinter.Toplevel):
+    """Open Galaxy symbol builder."""
+
+    def __init__(self, parent = None, pinlist = None, fontsize = 11, *args, **kwargs):
+        '''See the __init__ for Tkinter.Toplevel.'''
+        tkinter.Toplevel.__init__(self, parent, *args, **kwargs)
+        self.transient(parent)
+        self.parent = parent
+
+        s = ttk.Style()
+        s.configure('normal.TButton', font=('Helvetica', fontsize), border = 3, relief = 'raised')
+
+        self.title('Open Galaxy Symbol Builder')
+        self.pframe = tkinter.Frame(self)
+        self.pframe.grid(column = 0, row = 0, sticky = "news")
+
+        self.pframe.pindisplay = tkinter.Text(self.pframe)
+        self.pframe.pindisplay.pack(side = 'left', fill = 'y')
+        # Add scrollbar to symbol builder window
+        self.pframe.scrollbar = ttk.Scrollbar(self.pframe)
+        self.pframe.scrollbar.pack(side='right', fill='y')
+        # attach symbol builder window to scrollbar
+        self.pframe.pindisplay.config(yscrollcommand = self.pframe.scrollbar.set)
+        self.pframe.scrollbar.config(command = self.pframe.pindisplay.yview)
+
+        self.bbar = ttk.Frame(self)
+        self.bbar.grid(column = 0, row = 1, sticky = "news")
+        self.bbar.cancel_button = ttk.Button(self.bbar, text='Cancel',
+		command=self.close, style = 'normal.TButton')
+        self.bbar.cancel_button.grid(column=0, row=0, padx = 5)
+
+        self.bbar.okay_button = ttk.Button(self.bbar, text='Okay',
+		command=self.okay, style = 'normal.TButton')
+        self.bbar.okay_button.grid(column=1, row=0, padx = 5)
+
+        typelist = ['input', 'output', 'inout', 'power', 'gnd']
+        self.pinlist = []
+        self.pvar = []
+        self.result = None
+
+        # Each pinlist entry is in the form <pin_name>:<type>
+        # where <type> is one of "input", "output", "inout",
+        # "power", or "gnd".
+
+        n = 0
+        for pin in pinlist:
+            p = pin.split(':')
+            pinname = p[0]
+            pintype = p[1]
+
+            newpvar = tkinter.StringVar(self.pframe.pindisplay)
+            self.pinlist.append(pinname)
+            self.pvar.append(newpvar)
+            newpvar.set(pintype) 
+            ttk.Label(self.pframe.pindisplay, text=pinname,
+			style = 'normal.TButton').grid(row = n,
+			column = 0, padx = 5, sticky = 'nsew')
+            ttk.OptionMenu(self.pframe.pindisplay, newpvar,
+			pintype, *typelist, style = 'blue.TMenubutton').grid(row = n,
+			column = 1, padx = 5, sticky = 'nswe')
+            n += 1
+
+        self.grab_set()
+        self.initial_focus = self
+        self.protocol("WM_DELETE_WINDOW", self.close)
+        self.initial_focus.focus_set()
+        self.wait_window(self)
+
+    def grid_configure(self, padx, pady):
+        pass
+
+    def okay(self):
+        # return the new pin list.
+        pinlist = []
+        n = 0
+        for p in self.pinlist:
+            pinlist.append(p + ':' + str(self.pvar[n].get()))
+            n += 1
+
+        self.withdraw()
+        self.update_idletasks()
+        self.result = pinlist
+        self.close()
+
+    def close(self):
+        # remove symbol builder window
+        self.parent.focus_set()
+        self.destroy()
