#!/usr/bin/env python3
#
#--------------------------------------------------------
# Project Manager GUI.
#
# This is a Python tkinter script that handles local
# project management.  Much of this involves the
# running of ng-spice for characterization, allowing
# the user to determine where a circuit is failing
# characterization;  and when the design passes local
# characterization, it may be submitted to the
# marketplace for official characterization.
#
#--------------------------------------------------------
# Written by Tim Edwards
# efabless, inc.
# September 9, 2016
# Version 1.0
#--------------------------------------------------------

import io
import re
import os
import sys
import copy
import json
import time
import signal
import select
import datetime
import contextlib
import subprocess
import faulthandler

import tkinter
from tkinter import ttk
from tkinter import filedialog

import tksimpledialog
import tooltip
from consoletext import ConsoleText
from helpwindow import HelpWindow
from failreport import FailReport
from textreport import TextReport
from editparam import EditParam
from settings import Settings
from simhints import SimHints

import config

# User preferences file (if it exists)
prefsfile = '~/design/.profile/prefs.json'

#------------------------------------------------------
# Simple dialog for confirming quit or upload
#------------------------------------------------------

class ConfirmDialog(tksimpledialog.Dialog):
    def body(self, master, warning, seed):
        ttk.Label(master, text=warning, wraplength=500).grid(row = 0, columnspan = 2, sticky = 'wns')
        return self

    def apply(self):
        return 'okay'

#------------------------------------------------------
# Simple dialog with no "OK" button (can only cancel)
#------------------------------------------------------

class PuntDialog(tksimpledialog.Dialog):
    def body(self, master, warning, seed):
        if warning:
            ttk.Label(master, text=warning, wraplength=500).grid(row = 0, columnspan = 2, sticky = 'wns')
        return self

    def buttonbox(self):
        # Add button box with "Cancel" only.
        box = ttk.Frame(self.obox)
        w = ttk.Button(box, text="Cancel", width=10, command=self.cancel)
        w.pack(side='left', padx=5, pady=5)
        self.bind("<Escape>", self.cancel)
        box.pack(fill='x', expand='true')

    def apply(self):
        return 'okay'

#------------------------------------------------------
# Main class for this application
#------------------------------------------------------

class OpenGalaxyCharacterize(ttk.Frame):
    """local characterization GUI."""

    def __init__(self, parent, *args, **kwargs):
        ttk.Frame.__init__(self, parent, *args, **kwargs)
        self.root = parent
        self.init_gui()
        parent.protocol("WM_DELETE_WINDOW", self.on_quit)

    def on_quit(self):
        """Exits program."""
        if not self.check_saved():
            warning = 'Warning:  Simulation results have not been saved.'
            confirm = ConfirmDialog(self, warning).result
            if not confirm == 'okay':
                print('Quit canceled.')
                return
        if self.logfile:
            self.logfile.close()
        quit()

    def on_mousewheel(self, event):
        if event.num == 5:
            self.datasheet_viewer.yview_scroll(1, "units")
        elif event.num == 4:
            self.datasheet_viewer.yview_scroll(-1, "units")

    def init_gui(self):
        """Builds GUI."""
        global prefsfile

        message = []
        fontsize = 11

        # Read user preferences file, get default font size from it.
        prefspath = os.path.expanduser(prefsfile)
        if os.path.exists(prefspath):
            with open(prefspath, 'r') as f:
                self.prefs = json.load(f)
            if 'fontsize' in self.prefs:
                fontsize = self.prefs['fontsize']
        else:
            self.prefs = {}

        s = ttk.Style()

        available_themes = s.theme_names()
        s.theme_use(available_themes[0])

        s.configure('bg.TFrame', background='gray40')
        s.configure('italic.TLabel', font=('Helvetica', fontsize, 'italic'))
        s.configure('title.TLabel', font=('Helvetica', fontsize, 'bold italic'),
			foreground = 'brown', anchor = 'center')
        s.configure('normal.TLabel', font=('Helvetica', fontsize))
        s.configure('red.TLabel', font=('Helvetica', fontsize), foreground = 'red')
        s.configure('green.TLabel', font=('Helvetica', fontsize), foreground = 'green3')
        s.configure('blue.TLabel', font=('Helvetica', fontsize), foreground = 'blue')
        s.configure('hlight.TLabel', font=('Helvetica', fontsize), background='gray93')
        s.configure('rhlight.TLabel', font=('Helvetica', fontsize), foreground = 'red',
			background='gray93')
        s.configure('ghlight.TLabel', font=('Helvetica', fontsize), foreground = 'green3',
			background='gray93')
        s.configure('blue.TLabel', font=('Helvetica', fontsize), foreground = 'blue')
        s.configure('blue.TMenubutton', font=('Helvetica', fontsize), foreground = 'blue',
			border = 3, relief = 'raised')
        s.configure('normal.TButton', font=('Helvetica', fontsize),
			border = 3, relief = 'raised')
        s.configure('red.TButton', font=('Helvetica', fontsize), foreground = 'red',
			border = 3, relief = 'raised')
        s.configure('green.TButton', font=('Helvetica', fontsize), foreground = 'green3',
			border = 3, relief = 'raised')
        s.configure('hlight.TButton', font=('Helvetica', fontsize),
			border = 3, relief = 'raised', background='gray93')
        s.configure('rhlight.TButton', font=('Helvetica', fontsize), foreground = 'red',
			border = 3, relief = 'raised', background='gray93')
        s.configure('ghlight.TButton', font=('Helvetica', fontsize), foreground = 'green3',
			border = 3, relief = 'raised', background='gray93')
        s.configure('blue.TButton', font=('Helvetica', fontsize), foreground = 'blue',
			border = 3, relief = 'raised')
        s.configure('redtitle.TButton', font=('Helvetica', fontsize, 'bold italic'),
			foreground = 'red', border = 3, relief = 'raised')
        s.configure('bluetitle.TButton', font=('Helvetica', fontsize, 'bold italic'),
			foreground = 'blue', border = 3, relief = 'raised')

        # Create the help window
        self.help = HelpWindow(self, fontsize = fontsize)

        with io.StringIO() as buf, contextlib.redirect_stdout(buf):
            self.help.add_pages_from_file(config.apps_path + '/characterize_help.txt')
            message = buf.getvalue()

        # Set the help display to the first page
        self.help.page(0)

        # Create the failure report window
        self.failreport = FailReport(self, fontsize = fontsize)

        # LVS results get a text window of results
        self.textreport = TextReport(self, fontsize = fontsize)

        # Create the settings window
        self.settings = Settings(self, fontsize = fontsize, callback = self.callback)

        # Create the simulation hints window
        self.simhints = SimHints(self, fontsize = fontsize)

        # Create the edit parameter window
        self.editparam = EditParam(self, fontsize = fontsize)

        # Variables used by option menus and other stuff
        self.origin = tkinter.StringVar(self)
        self.cur_project = tkinter.StringVar(self)
        self.cur_datasheet = "(no selection)"
        self.datatop = {}
        self.status = {}
        self.caceproc = None
        self.logfile = None

        # Root window title
        self.root.title('Characterization')
        self.root.option_add('*tearOff', 'FALSE')
        self.pack(side = 'top', fill = 'both', expand = 'true')

        pane = tkinter.PanedWindow(self, orient = 'vertical', sashrelief='groove', sashwidth=6)
        pane.pack(side = 'top', fill = 'both', expand = 'true')
        self.toppane = ttk.Frame(pane)
        self.botpane = ttk.Frame(pane)

        # Get username
        if 'username' in self.prefs:
            username = self.prefs['username']
        else:
            userid = os.environ['USER']
            p = subprocess.run(['/ef/apps/bin/withnet',
			config.apps_path + '/og_uid_service.py', userid],
                        stdout = subprocess.PIPE)
            if p.stdout:
                uid_string = p.stdout.splitlines()[0].decode('utf-8')
                userspec = re.findall(r'[^"\s]\S*|".+?"', uid_string)
                if len(userspec) > 0:
                    username = userspec[0].strip('"')
                    # Note userspec[1] = UID and userspec[2] = role, useful
                    # for future applications.
                else:
                    username = userid
            else:
                username = userid

        # Label with the user
        self.toppane.title_frame = ttk.Frame(self.toppane)
        self.toppane.title_frame.grid(column = 0, row=0, sticky = 'nswe')

        self.toppane.title_frame.title = ttk.Label(self.toppane.title_frame, text='User:', style = 'red.TLabel')
        self.toppane.title_frame.user = ttk.Label(self.toppane.title_frame, text=username, style = 'blue.TLabel')

        self.toppane.title_frame.title.grid(column=0, row=0, ipadx = 5)
        self.toppane.title_frame.user.grid(column=1, row=0, ipadx = 5)

        #---------------------------------------------
        ttk.Separator(self.toppane, orient='horizontal').grid(column = 0, row = 1, sticky = 'nswe')
        #---------------------------------------------

        self.toppane.title2_frame = ttk.Frame(self.toppane)
        self.toppane.title2_frame.grid(column = 0, row = 2, sticky = 'nswe')
        self.toppane.title2_frame.datasheet_label = ttk.Label(self.toppane.title2_frame, text="Datasheet:",
		style = 'normal.TLabel')
        self.toppane.title2_frame.datasheet_label.grid(column=0, row=0, ipadx = 5)

        # New datasheet select button
        self.toppane.title2_frame.datasheet_select = ttk.Button(self.toppane.title2_frame,
		text=self.cur_datasheet, style='normal.TButton', command=self.choose_datasheet)
        self.toppane.title2_frame.datasheet_select.grid(column=1, row=0, ipadx = 5)

        tooltip.ToolTip(self.toppane.title2_frame.datasheet_select,
			text = "Select new datasheet file")

        # Show path to datasheet
        self.toppane.title2_frame.path_label = ttk.Label(self.toppane.title2_frame, text=self.cur_datasheet,
		style = 'normal.TLabel')
        self.toppane.title2_frame.path_label.grid(column=2, row=0, ipadx = 5, padx = 10)

        # Spacer in middle moves selection button to right
        self.toppane.title2_frame.sep_label = ttk.Label(self.toppane.title2_frame, text=' ',
		style = 'normal.TLabel')
        self.toppane.title2_frame.sep_label.grid(column=3, row=0, ipadx = 5, padx = 10)
        self.toppane.title2_frame.columnconfigure(3, weight = 1)
        self.toppane.title2_frame.rowconfigure(0, weight=0)

        # Selection for origin of netlist
        self.toppane.title2_frame.origin_label = ttk.Label(self.toppane.title2_frame,
		text='Netlist from:', style = 'normal.TLabel')
        self.toppane.title2_frame.origin_label.grid(column=4, row=0, ipadx = 5, padx = 10)

        self.origin.set('Schematic Capture')
        self.toppane.title2_frame.origin_select = ttk.OptionMenu(self.toppane.title2_frame,
		self.origin, 'Schematic Capture', 'Schematic Capture', 'Layout Extracted',
		style='blue.TMenubutton', command=self.load_results)
        self.toppane.title2_frame.origin_select.grid(column=5, row=0, ipadx = 5)

        #---------------------------------------------
        ttk.Separator(self.toppane, orient='horizontal').grid(column = 0, row = 3, sticky = 'news')
        #---------------------------------------------

        # Datasheet information goes here when datasheet is loaded.
        self.mframe = ttk.Frame(self.toppane)
        self.mframe.grid(column = 0, row = 4, sticky = 'news')

        # Row 4 (mframe) is expandable, the other rows are not.
        self.toppane.rowconfigure(0, weight = 0)
        self.toppane.rowconfigure(1, weight = 0)
        self.toppane.rowconfigure(2, weight = 0)
        self.toppane.rowconfigure(3, weight = 0)
        self.toppane.rowconfigure(4, weight = 1)
        self.toppane.columnconfigure(0, weight = 1)

        #---------------------------------------------
        # ttk.Separator(self, orient='horizontal').grid(column=0, row=5, sticky='ew')
        #---------------------------------------------

        # Add a text window below the datasheet to capture output.  Redirect
        # print statements to it.

        self.botpane.console = ttk.Frame(self.botpane)
        self.botpane.console.pack(side = 'top', fill = 'both', expand = 'true')

        self.text_box = ConsoleText(self.botpane.console, wrap='word', height = 4)
        self.text_box.pack(side='left', fill='both', expand='true')
        console_scrollbar = ttk.Scrollbar(self.botpane.console)
        console_scrollbar.pack(side='right', fill='y')
        # attach console to scrollbar
        self.text_box.config(yscrollcommand = console_scrollbar.set)
        console_scrollbar.config(command = self.text_box.yview)

        # Add button bar at the bottom of the window
        self.bbar = ttk.Frame(self.botpane)
        self.bbar.pack(side = 'top', fill = 'x')
        # Progress bar expands with the window, buttons don't
        self.bbar.columnconfigure(6, weight = 1)

        # Define the "quit" button and action
        self.bbar.quit_button = ttk.Button(self.bbar, text='Close', command=self.on_quit,
		style = 'normal.TButton')
        self.bbar.quit_button.grid(column=0, row=0, padx = 5)

        # Define the save button
        self.bbar.save_button = ttk.Button(self.bbar, text='Save', command=self.save_results,
		style = 'normal.TButton')
        self.bbar.save_button.grid(column=1, row=0, padx = 5)

        # Define the save-as button
        self.bbar.saveas_button = ttk.Button(self.bbar, text='Save As', command=self.save_manual,
		style = 'normal.TButton')

	# Also a load button
        self.bbar.load_button = ttk.Button(self.bbar, text='Load', command=self.load_manual,
		style = 'normal.TButton')

        # Define help button
        self.bbar.help_button = ttk.Button(self.bbar, text='Help', command=self.help.open,
		style = 'normal.TButton')
        self.bbar.help_button.grid(column = 4, row = 0, padx = 5)

        # Define settings button
        self.bbar.settings_button = ttk.Button(self.bbar, text='Settings',
		command=self.settings.open, style = 'normal.TButton')
        self.bbar.settings_button.grid(column = 5, row = 0, padx = 5)

        # Define upload action
        self.bbar.upload_button = ttk.Button(self.bbar, text='Submit', state = 'enabled',
		command=self.upload_to_marketplace, style = 'normal.TButton')
        # "Submit" button remains unplaced;  upload may be done from the web side. . .
        # self.bbar.upload_button.grid(column = 8, row = 0, padx = 5, sticky = 'ens')

        tooltip.ToolTip(self.bbar.quit_button, text = "Exit characterization tool")
        tooltip.ToolTip(self.bbar.save_button, text = "Save current characterization state")
        tooltip.ToolTip(self.bbar.saveas_button, text = "Save current characterization state")
        tooltip.ToolTip(self.bbar.load_button, text = "Load characterization state from file")
        tooltip.ToolTip(self.bbar.help_button, text = "Start help tool")
        tooltip.ToolTip(self.bbar.settings_button, text = "Manage characterization tool settings")
        tooltip.ToolTip(self.bbar.upload_button, text = "Submit completed design to Marketplace")

        # Inside frame with main electrical parameter display and scrollbar
        # To make the frame scrollable, it must be a frame inside a canvas.
        self.datasheet_viewer = tkinter.Canvas(self.mframe)
        self.datasheet_viewer.grid(row = 0, column = 0, sticky = 'nsew')
        self.datasheet_viewer.dframe = ttk.Frame(self.datasheet_viewer,
			style='bg.TFrame')
        # Place the frame in the canvas
        self.datasheet_viewer.create_window((0,0),
			window=self.datasheet_viewer.dframe,
			anchor="nw", tags="self.frame")

        # Make sure the main window resizes, not the scrollbars.
        self.mframe.rowconfigure(0, weight = 1)
        self.mframe.columnconfigure(0, weight = 1)
        # X scrollbar for datasheet viewer
        main_xscrollbar = ttk.Scrollbar(self.mframe, orient = 'horizontal')
        main_xscrollbar.grid(row = 1, column = 0, sticky = 'nsew')
        # Y scrollbar for datasheet viewer
        main_yscrollbar = ttk.Scrollbar(self.mframe, orient = 'vertical')
        main_yscrollbar.grid(row = 0, column = 1, sticky = 'nsew')
        # Attach console to scrollbars
        self.datasheet_viewer.config(xscrollcommand = main_xscrollbar.set)
        main_xscrollbar.config(command = self.datasheet_viewer.xview)
        self.datasheet_viewer.config(yscrollcommand = main_yscrollbar.set)
        main_yscrollbar.config(command = self.datasheet_viewer.yview)

        # Make sure that scrollwheel pans window
        self.datasheet_viewer.bind_all("<Button-4>", self.on_mousewheel)
        self.datasheet_viewer.bind_all("<Button-5>", self.on_mousewheel)

        # Set up configure callback
        self.datasheet_viewer.dframe.bind("<Configure>", self.frame_configure)

        # Add the panes once the internal geometry is known
        pane.add(self.toppane)
        pane.add(self.botpane)
        pane.paneconfig(self.toppane, stretch='first')

        # Initialize variables
        self.sims_to_go = []

        # Capture time of start to compare against the annotated
        # output file timestamp.
        self.starttime = time.time()

        # Redirect stdout and stderr to the console as the last thing to do. . .
        # Otherwise errors in the GUI get sucked into the void.
        self.stdout = sys.stdout
        self.stderr = sys.stderr
        sys.stdout = ConsoleText.StdoutRedirector(self.text_box)
        sys.stderr = ConsoleText.StderrRedirector(self.text_box)

        if message:
            print(message)

    def frame_configure(self, event):
        self.update_idletasks()
        self.datasheet_viewer.configure(scrollregion=self.datasheet_viewer.bbox("all"))

    def logstart(self):
        # Start a logfile (or append to it, if it already exists)
        # Disabled by default, as it can get very large.
        # Can be enabled from Settings.
        if self.settings.get_log() == True:
            dataroot = os.path.splitext(self.cur_datasheet)[0]
            if not self.logfile:
                self.logfile = open(dataroot + '.log', 'a')

                # Print some initial information to the logfile.
                self.logprint('-------------------------')
                self.logprint('Starting new log file ' + datetime.datetime.now().strftime('%c'),
				doflush=True)

    def logstop(self):
        if self.logfile:
            self.logprint('-------------------------', doflush=True)
            self.logfile.close()
            self.logfile = []

    def logprint(self, message, doflush=False):
        if self.logfile:
            self.logfile.buffer.write(message.encode('utf-8'))
            self.logfile.buffer.write('\n'.encode('utf-8'))
            if doflush:
                self.logfile.flush()

    def set_datasheet(self, datasheet):
        if self.logfile:
            self.logprint('end of log.')
            self.logprint('-------------------------', doflush=True)
            self.logfile.close()
            self.logfile = None

        if not os.path.isfile(datasheet):
            print('Error:  File ' + datasheet + ' not found.')
            return

        [dspath, dsname] = os.path.split(datasheet)
        # Read the datasheet
        with open(datasheet) as ifile:
            try:
                datatop = json.load(ifile)
            except json.decoder.JSONDecodeError as e:
                print("Error:  Parse error reading JSON file " + datasheet + ':')
                print(str(e))
                return
            else:
                # 'request-hash' set to '.' for local simulation
                datatop['request-hash'] = '.'
        try:
            dsheet = datatop['data-sheet']
        except KeyError:
            print("Error:  JSON file is not a datasheet!\n")
        else:
            self.datatop = datatop
            self.cur_datasheet = datasheet
            self.create_datasheet_view()
            self.toppane.title2_frame.datasheet_select.configure(text=dsname)
            self.toppane.title2_frame.path_label.configure(text=datasheet)

            # Determine if there is a saved, annotated JSON file that is
            # more recent than the netlist used for simulation.
            self.load_results()

        # Attempt to set the datasheet viewer width to the interior width
        # but do not set it larger than the available desktop.
        self.update_idletasks()
        widthnow = self.datasheet_viewer.winfo_width()
        width = self.datasheet_viewer.dframe.winfo_width()
        screen_width = self.root.winfo_screenwidth()
        if width > widthnow:
            if width < screen_width - 10:
                self.datasheet_viewer.configure(width=width)
            else:
                self.datasheet_viewer.configure(width=screen_width - 10)
        elif widthnow > screen_width:
            self.datasheet_viewer.configure(width=screen_width - 10)
        elif widthnow > width:
            self.datasheet_viewer.configure(width=width)

        # Likewise for the height, up to 3/5 of the desktop height.
        height = self.datasheet_viewer.dframe.winfo_height()
        heightnow = self.datasheet_viewer.winfo_height()
        screen_height = self.root.winfo_screenheight()
        if height > heightnow:
            if height < screen_height * 0.6:
                self.datasheet_viewer.configure(height=height)
            else:
                self.datasheet_viewer.configure(height=screen_height * 0.6)
        elif heightnow > screen_height:
            self.datasheet_viewer.configure(height=screen_height - 10)
        elif heightnow > height:
            self.datasheet_viewer.configure(height=height)

    def choose_datasheet(self):
        datasheet = filedialog.askopenfilename(multiple = False,
			initialdir = os.path.expanduser('~/design'),
			filetypes = (("JSON File", "*.json"),("All Files","*.*")),
			title = "Find a datasheet.")
        if datasheet != '':
            self.set_datasheet(datasheet)

    def cancel_upload(self):
        # Post a cancelation message to CACE.  CACE responds by setting the
        # status to 'canceled'.  The watchprogress procedure is responsible for
        # returning the button to 'Submit' when the characterization finishes
        # or is canceled.
        dspath = os.path.split(self.cur_datasheet)[0]
        datasheet = os.path.split(self.cur_datasheet)[1]
        designname = os.path.splitext(datasheet)[0]
        print('Cancel characterization of ' + designname + ' (' + dspath + ' )')
        subprocess.run(['/ef/apps/bin/withnet',
			config.apps_path + '/cace_design_upload.py', '-cancel',
                        dspath])
        self.removeprogress()
        self.bbar.upload_button.configure(text='Submit', state = 'enabled',
			command=self.upload_to_marketplace,
			style = 'normal.TButton')
        # Delete the remote status file.
        dsdir = dspath + '/ngspice/char'
        statusname = dsdir + '/remote_status.json'
        if os.path.exists(statusname):
            os.remove(statusname)

    def progress_bar_setup(self, dspath):
        # Create the progress bar at the bottom of the window to indicate
        # the status of a challenge submission.

        # Disable the Submit button
        self.bbar.upload_button.configure(state='disabled')

        # Start progress bar watchclock
        dsdir = dspath + '/ngspice/char'
        statusname = dsdir + '/remote_status.json'
        if os.path.exists(statusname):
            statbuf = os.stat(statusname)
            mtime = statbuf.st_mtime
        else:
            if os.path.exists(dsdir):
                # Write a simple status
                status = {'message': 'not started', 'total': '0', 'completed': '0'}
                with open(statusname, 'w') as f:
                    json.dump(status, f)
            mtime = 0
        # Create a TTK progress bar widget in the buttonbar.
        self.bbar.progress_label = ttk.Label(self.bbar, text="Characterization: ",
		style = 'normal.TLabel')
        self.bbar.progress_label.grid(column=4, row=0, ipadx = 5)

        self.bbar.progress_message = ttk.Label(self.bbar, text="(not started)",
		style = 'blue.TLabel')
        self.bbar.progress_message.grid(column=5, row=0, ipadx = 5)
        self.bbar.progress = ttk.Progressbar(self.bbar,
			orient='horizontal', mode='determinate')
        self.bbar.progress.grid(column = 6, row = 0, padx = 5, sticky = 'nsew')
        self.bbar.progress_text = ttk.Label(self.bbar, text="0/0",
		style = 'blue.TLabel')
        self.bbar.progress_text.grid(column=7, row=0, ipadx = 5)

        # Start the timer to watch the progress
        self.watchprogress(statusname, mtime, 1)

    def check_ongoing_upload(self):
        # Determine if an upload is ongoing when the characterization tool is
        # started.  If so, immediately go to the 'characterization running'
        # state with progress bar.
        dspath = os.path.split(self.cur_datasheet)[0]
        datasheet = os.path.split(self.cur_datasheet)[1]
        designname = os.path.splitext(datasheet)[0]
        dsdir = dspath + '/ngspice/char'
        statusname = dsdir + '/remote_status.json'
        if os.path.exists(statusname):
            with open(statusname, 'r') as f:
                status = json.load(f)
                if 'message' in status:
                    if status['message'] == 'in progress':
                        print('Design characterization in progress for ' + designname + ' (' + dspath + ' )')
                        self.progress_bar_setup(dspath)
                else:
                    print("No message in status file")

    def upload_to_marketplace(self):
        dspath = os.path.split(self.cur_datasheet)[0]
        datasheet = os.path.split(self.cur_datasheet)[1]
        dsheet = self.datatop['data-sheet']
        designname = dsheet['ip-name']

        # Make sure a netlist has been generated.
        if self.sim_param('check') == False:
            print('No netlist was generated, cannot submit!')
            return

        # For diagnostic purposes, place all of the characterization tool
        # settings into datatop['settings'] when uploading to remote CACE.
        runtime_settings = {}
        runtime_settings['force-regenerate'] = self.settings.get_force()
        runtime_settings['edit-all-params'] = self.settings.get_edit()
        runtime_settings['keep-files'] = self.settings.get_keep()
        runtime_settings['make-plots'] = self.settings.get_plot()
        runtime_settings['submit-test-mode'] = self.settings.get_test()
        runtime_settings['submit-as-schematic'] = self.settings.get_schem()
        runtime_settings['submit-failing'] = self.settings.get_submitfailed()
        runtime_settings['log-output'] = self.settings.get_log()

        # Write out runtime settings as a JSON file
        with open(dspath + '/settings.json', 'w') as file:
            json.dump(runtime_settings, file, indent = 4)

        warning = ''
        must_confirm = False
        if self.settings.get_schem() == True:
            # If a layout exists but "submit as schematic" was chosen, then
            # flag a warning and insist on confirmation.
            if os.path.exists(dspath + '/mag/' + designname + '.mag'):
                warning += 'Warning: layout exists but only schematic has been selected for submission'
                must_confirm = True
            else:
                print('No layout in ' + dspath + '/mag/' + designname + '.mag')
                print('Schematic only submission selection is not needed.')
        else:
            # Likewise, check if schematic netlist results are showing but a layout
            # exists, which means that the existing results are not the ones that are
            # going to be tested.
            if self.origin.get() == 'Schematic Capture':
                if os.path.exists(dspath + '/mag/' + designname + '.mag'):
                    warning += 'Warning: schematic results are shown but remote CACE will be run on layout results.'
                    must_confirm = True


        # Make a check to see if all simulations have been made and passed.  If so,
        # then just do the upload.  If not, then generate a warning dialog and
        # require the user to respond to force an upload in spite of an incomplete
        # simulation.  Give dire warnings if any simulation has failed.

        failures = 0
        missed = 0
        for param in dsheet['electrical-params']:
            if 'max' in param:
                pmax = param['max']
                if not 'value' in pmax:
                    missed += 1
                elif 'score' in pmax:
                    if pmax['score'] == 'fail':
                        failures += 1
            if 'min' in param:
                pmin = param['min']
                if not 'value' in pmin:
                    missed += 1
                elif 'score' in pmin:
                    if pmin['score'] == 'fail':
                        failures += 1

        if missed > 0:
            if must_confirm == True:
                warning += '\n'
            warning += 'Warning:  Not all critical parameters have been simulated.'
        if missed > 0 and failures > 0:
            warning += '\n'
        if failures > 0:
            warning += 'Dire Warning:  This design has errors on critical parameters!'

        # Require confirmation
        if missed > 0 or failures > 0:
            must_confirm = True

        if must_confirm:
            if self.settings.get_submitfailed() == True:
                confirm = ConfirmDialog(self, warning).result
            else:
                confirm = PuntDialog(self, warning).result
            if not confirm == 'okay':
                print('Upload canceled.')
                return
            print('Upload selected')

        # Save hints in file in spi/ directory.
        hintlist = []
        for eparam in dsheet['electrical-params']:
            if not 'editable' in eparam:
                if 'hints' in eparam:
                    hintlist.append(eparam['hints'])
                else:
                    # Must have a placeholder
                    hintlist.append({})
        if hintlist:
            hfilename = dspath + '/hints.json'
            with open(hfilename, 'w') as hfile:
                json.dump(hintlist, hfile, indent = 4)

        print('Uploading design ' + designname + ' (' + dspath + ' )')
        print('to marketplace and submitting for characterization.')
        if not self.settings.get_test():
            self.progress_bar_setup(dspath)
            self.update_idletasks()
        subprocess.run(['/ef/apps/bin/withnet',
			config.apps_path + '/cace_design_upload.py',
                        dspath])

        # Remove the settings file
        os.remove(dspath + '/settings.json')
        os.remove(dspath + '/hints.json')

    def removeprogress(self):
        # Remove the progress bar.  This is left up for a second after
        # completion or cancelation so that the final message has time
        # to be seen.
        try:
            self.bbar.progress_label.destroy()
            self.bbar.progress_message.destroy()
            self.bbar.progress.destroy()
            self.bbar.progress_text.destroy()
        except:
            pass

    def watchprogress(self, filename, filemtime, timeout):
        new_timeout = timeout + 1 if timeout > 0 else 0
        # 2 minute timeout for startup (note that all simulation files have to be
        # made during this period.
        if new_timeout == 120:
            self.cancel_upload()
            return

        # If file does not exist, then keep checking at 2 second intervals.
        if not os.path.exists(filename):
            self.after(2000, lambda: self.watchprogress(filename, filemtime, new_timeout))
            return

        # If filename file is modified, then update progress bar;
        # otherwise, restart the clock.
        statbuf = os.stat(filename)
        if statbuf.st_mtime > filemtime:
            self.after(250)	# Otherwise can catch file while it's incomplete. . .
            if self.update_progress(filename) == True:
                self.after(1000, lambda: self.watchprogress(filename, filemtime, 0))
            else:
                # Remove the progress bar when done, after letting the final
                # message display for a second.
                self.after(1500, self.removeprogress)
                # And return the button to "Submit" and in an enabled state.
                self.bbar.upload_button.configure(text='Submit', state = 'enabled',
				command=self.upload_to_marketplace,
				style = 'normal.TButton')
        else:
            self.after(1000, lambda: self.watchprogress(filename, filemtime, new_timeout))

    def update_progress(self, filename):
        # On first update, button changes from "Submit" to "Cancel"
        # This ensures that the 'remote_status.json' file has been sent
        # from the CACE with the hash value needed for the CACE to identify
        # the right simulation and cancel it.
        if self.bbar.upload_button.configure('text')[-1] == 'Submit':
            self.bbar.upload_button.configure(text='Cancel', state = 'enabled',
			command=self.cancel_upload, style = 'red.TButton')

        if not os.path.exists(filename):
            return False

        # Update the progress bar during an CACE simulation run.
        # Read the status file
        try:
            with open(filename, 'r') as f:
                status = json.load(f)
        except (PermissionError, FileNotFoundError):
            # For a very short time the user does not have ownership of
            # the file and the read will fail.  This is a rare case, so
            # just punt until the next cycle.
            return True

        if 'message' in status:
            self.bbar.progress_message.configure(text = status['message'])

        try:
            total = int(status['total'])
        except:
            total = 0
        else:
            self.bbar.progress.configure(maximum = total)
        
        try:
            completed = int(status['completed'])
        except:
            completed = 0
        else:
            self.bbar.progress.configure(value = completed)

        self.bbar.progress_text.configure(text = str(completed) + '/' + str(total))
        if completed > 0 and completed == total:
            print('Notice:  Design completed.')
            print('The CACE server has finished characterizing the design.')
            print('Go to the efabless marketplace to view submission.')
            return False
        elif status['message'] == 'canceled':
            print('Notice:  Design characterization was canceled.')
            return False
        else:
            return True

    def topfilter(self, line):
        # Check output for ubiquitous "Reference value" lines and remove them.
        # This happens before logging both to the file and to the console.
        refrex = re.compile('Reference value')
        rmatch = refrex.match(line)
        if not rmatch:
            return line
        else:
            return None

    def spicefilter(self, line):
        # Check for the alarmist 'tran simulation interrupted' message and remove it.
        # Check for error or warning and print as stderr or stdout accordingly.
        intrex = re.compile('tran simulation interrupted')
        warnrex = re.compile('.*warning', re.IGNORECASE)
        errrex = re.compile('.*error', re.IGNORECASE)

        imatch = intrex.match(line)
        if not imatch:
            ematch = errrex.match(line)
            wmatch = warnrex.match(line)
            if ematch or wmatch:
                print(line, file=sys.stderr)
            else:
                print(line, file=sys.stdout)

    def printwarn(self, output):
        # Check output for warning or error
        if not output:
            return 0

        warnrex = re.compile('.*warning', re.IGNORECASE)
        errrex = re.compile('.*error', re.IGNORECASE)

        errors = 0
        outlines = output.splitlines()
        for line in outlines:
            try:
                wmatch = warnrex.match(line)
            except TypeError:
                line = line.decode('utf-8')
                wmatch = warnrex.match(line)
            ematch = errrex.match(line)
            if ematch:
                errors += 1
            if ematch or wmatch:
                print(line)
        return errors

    def sim_all(self):
        if self.caceproc:
            # Failsafe
            if self.caceproc.poll() != None:
                self.caceproc = None
            else:
                print('Simulation in progress must finish first.')
                return

        # Create netlist if necessary, check for valid result
        if self.sim_param('check') == False:
            return

        # Simulate all of the electrical parameters in turn
        self.sims_to_go = []
        for puniq in self.status:
            self.sims_to_go.append(puniq)

        # Start first sim
        if len(self.sims_to_go) > 0:
            puniq = self.sims_to_go[0]
            self.sims_to_go = self.sims_to_go[1:]
            self.sim_param(puniq)

        # Button now stops the simulations
        self.allsimbutton.configure(style = 'redtitle.TButton', text='Stop Simulations',
		command=self.stop_sims)

    def stop_sims(self):
        # Make sure there will be no more simulations
        self.sims_to_go = []
        if not self.caceproc:
            print("No simulation running.")
            return
        self.caceproc.terminate()
        # Use communicate(), not wait() , on piped processes to avoid deadlock.
        try:
            self.caceproc.communicate(timeout=10)
        except subprocess.TimeoutExpired:
            self.caceproc.kill()
            self.caceproc.communicate()
            print("CACE process killed.")
        else:
            print("CACE process exited.")
        # Let watchdog timer see that caceproc is gone and reset the button.

    def edit_param(self, param):
        # Edit the conditions under which the parameter is tested.
        if ('editable' in param and param['editable'] == True) or self.settings.get_edit() == True:
            self.editparam.populate(param)
            self.editparam.open()
        else:
            print('Parameter is not editable')

    def copy_param(self, param):
        # Make a copy of the parameter (for editing)
        newparam = param.copy()
        # Make the copied parameter editable
        newparam['editable'] = True
        # Append this to the electrical parameter list after the item being copied
        if 'display' in param:
            newparam['display'] = param['display'] + ' (copy)'
        datatop = self.datatop
        dsheet = datatop['data-sheet']
        eparams = dsheet['electrical-params']
        eidx = eparams.index(param)
        eparams.insert(eidx + 1, newparam)
        self.create_datasheet_view()

    def delete_param(self, param):
        # Remove an electrical parameter from the datasheet.  This is only
        # allowed if the parameter has been copied from another and so does
        # not belong to the original set of parameters.
        datatop = self.datatop
        dsheet = datatop['data-sheet']
        eparams = dsheet['electrical-params']
        eidx = eparams.index(param)
        eparams.pop(eidx)
        self.create_datasheet_view()

    def add_hints(self, param, simbutton):
        # Raise hints window and configure appropriately for the parameter.
        # Fill in any existing hints.
        self.simhints.populate(param, simbutton)
        self.simhints.open()

    def sim_param(self, method):
        if self.caceproc:
            # Failsafe
            if self.caceproc.poll() != None:
                self.caceproc = None
            else:
                print('Simulation in progress, queued for simulation.')
                if not method in self.sims_to_go:
                    self.sims_to_go.append(method)
                return False

        # Get basic values for datasheet and ip-name

        dspath = os.path.split(self.cur_datasheet)[0]
        dsheet = self.datatop['data-sheet']
        dname = dsheet['ip-name']

        # Open log file, if specified
        self.logstart()

        # Check for whether the netlist is specified to come from schematic
        # or layout.  Add a record to the datasheet depending on whether
        # the netlist is from layout or extracted.  The settings window has
        # a checkbox to force submitting as a schematic even if layout exists.

        if self.origin.get() == 'Schematic Capture':
            dsheet['netlist-source'] = 'schematic'
        else:
            dsheet['netlist-source'] = 'layout'

        if self.settings.get_force() == True:
            dsheet['regenerate'] = 'force'

        basemethod = method.split('.')[0]
        if basemethod == 'check':	# used by submit to ensure netlist exists
            return True
  
        if basemethod == 'physical':
            print('Checking ' + method.split('.')[1])
        else:
            print('Simulating method = ' + basemethod)
        self.stat_label = self.status[method]
        self.stat_label.configure(text='(in progress)', style='blue.TLabel')
        # Update status now
        self.update_idletasks()
        print('Datasheet directory is = ' + dspath + '\n')

        # Instead of using the original datasheet, use the one in memory so that
        # it accumulates results.  A "save" button will update the original.
        if not os.path.isdir(dspath + '/ngspice'):
            os.makedirs(dspath + '/ngspice')
        dsdir = dspath + '/ngspice/char'
        if not os.path.isdir(dsdir):
            os.makedirs(dsdir)
        with open(dsdir + '/datasheet.json', 'w') as file:
            json.dump(self.datatop, file, indent = 4)
        # As soon as we call CACE, we will be watching the status of file
        # datasheet_anno.  So create it if it does not exist, else attempting
        # to stat a nonexistant file will cause the 1st simulation to fail.
        if not os.path.exists(dsdir + '/datasheet_anno.json'):
            open(dsdir + '/datasheet_anno.json', 'a').close()
        # Call cace_gensim with full set of options
        # First argument is the root directory
        # (Diagnostic)
        design_path = dspath + '/spi'

        print('Calling cace_gensim.py ' + dspath + 
			' -local -method=' + method)

        modetext = ['-local']
        if self.settings.get_keep() == True:
            print(' -keep ')
            modetext.append('-keep')

        if self.settings.get_plot() == True:
            print(' -plot ')
            modetext.append('-plot')

        print(' -simdir=' + dsdir + ' -datasheetdir=' + dsdir + ' -designdir=' + design_path)
        print(' -layoutdir=' + dspath + '/mag' + ' -testbenchdir=' + dspath + '/testbench')
        print(' -datasheet=datasheet.json')
        
        self.caceproc = subprocess.Popen([config.apps_path + '/cace_gensim.py', dspath,
			*modetext,
			'-method=' + method,  # Call local mode w/method
			'-simdir=' + dsdir,
			'-datasheetdir=' + dsdir,
			'-designdir=' + design_path,
			'-layoutdir=' + dspath + '/mag',
			'-testbenchdir=' + dspath + '/testbench',
			'-datasheet=datasheet.json'],
          		stdout=subprocess.PIPE, stderr=subprocess.PIPE, bufsize=0)

        # Simulation finishes on its own time.  Use watchdog to handle.
        # Note that python "watchdog" is threaded, and tkinter is not thread-safe.
        # So watchdog is done with a simple timer loop.
        statbuf = os.stat(dsdir + '/datasheet.json')
        checktime = statbuf.st_mtime

        filename = dsdir + '/datasheet_anno.json'
        statbuf = os.stat(filename)
        self.watchclock(filename, statbuf.st_mtime, checktime)

    def watchclock(self, filename, filemtime, checktime):
        # In case simulations cleared while watchclock was pending
        if self.caceproc == None:
            return
        # Poll cace_gensim to see if it finished
        cace_status = self.caceproc.poll()
        if cace_status != None:
            try:
                output = self.caceproc.communicate(timeout=1)
            except ValueError:
                print("CACE gensim forced stop, status " + str(cace_status))
            else: 
                outlines = output[0]
                errlines = output[1]
                for line in outlines.splitlines():
                    print(line.decode('utf-8'))
                for line in errlines.splitlines():
                    print(line.decode('utf-8'))
                print("CACE gensim exited with status " + str(cace_status))
        else:
            n = 0
            while True:
                self.update_idletasks()
                # Attempt to avoid infinite loop, unsure of the cause.
                n += 1
                if n > 100:
                    n = 0
                    cace_status = self.caceproc.poll()
                    if cace_status != None:
                        break
                    self.logprint("100 lines of output", doflush=True)
                    # Something went wrong.  Kill the process.
                    # self.stop_sims()
                sresult = select.select([self.caceproc.stdout, self.caceproc.stderr], [], [], 0)[0]
                if self.caceproc.stdout in sresult:
                    outstring = self.caceproc.stdout.readline().decode().strip()
                    self.logprint(outstring, doflush=True)
                    print(outstring)
                elif self.caceproc.stderr in sresult:
                    # ngspice passes back simulation time on stderr.  This ends in \r but no
                    # newline.  '\r' ends the transmission, so return.
                    # errstring = self.topfilter(self.caceproc.stderr.readline().decode().strip())
                    # if errstring:
                    #     self.logprint(errstring, doflush=True)
                    #     # Recast everything that isn't an error back into stdout.
                    #     self.spicefilter(errstring)
                    ochar = str(self.caceproc.stderr.read(1).decode())
                    if ochar == '\r':
                        print('')
                        break
                    else:
                        print(ochar, end='')
                else:
                    break

        # If filename file is modified, then call annotate;  otherwise, restart the clock.
        statbuf = os.stat(filename)
        if (statbuf.st_mtime > filemtime) or (cace_status != None):
            if cace_status != None:
                self.caceproc = None
            else:
                # Re-run to catch last output.
                self.after(500, lambda: self.watchclock(filename, statbuf.st_mtime, checktime))
                return
            if cace_status != 0:
                print('Errors encountered in simulation.')
                self.logprint('Errors in simulation, CACE status = ' + str(cace_status), doflush=True)
            self.annotate('anno', checktime)
            if len(self.sims_to_go) > 0:
                puniq = self.sims_to_go[0]
                self.sims_to_go = self.sims_to_go[1:]
                self.sim_param(puniq)
            else:
                # Button goes back to original text and command
                self.allsimbutton.configure(style = 'bluetitle.TButton',
				text='Simulate All', command = self.sim_all)
        elif not self.caceproc:
            # Process terminated by "stop"
            # Button goes back to original text and command
            self.allsimbutton.configure(style = 'bluetitle.TButton',
			text='Simulate All', command = self.sim_all)
            # Just redraw everthing so that the "(in progress)" message goes away.
            self.annotate('anno', checktime)
        else:
            self.after(500, lambda: self.watchclock(filename, filemtime, checktime))

    def clear_results(self, dsheet):
        # Remove results from the window by clearing parameter results
        paramstodo = []
        if 'electrical-params' in dsheet:
            paramstodo.extend(dsheet['electrical-params'])
        if 'physical-params' in dsheet:
            paramstodo.extend(dsheet['physical-params'])

        for param in paramstodo:
            # Fill frame with electrical parameter information
            if 'max' in param:
                maxrec = param['max']
                if 'value' in maxrec:
                    maxrec.pop('value')
                if 'score' in maxrec:
                    maxrec.pop('score')
            if 'typ' in param:
                typrec = param['typ']
                if 'value' in typrec:
                    typrec.pop('value')
                if 'score' in typrec:
                    typrec.pop('score')
            if 'min' in param:
                minrec = param['min']
                if 'value' in minrec:
                    minrec.pop('value')
                if 'score' in minrec:
                    minrec.pop('score')
            if 'results' in param:
                param.pop('results')

            if 'plot' in param:
                plotrec = param['plot']
                if 'status' in plotrec:
                    plotrec.pop('status')

        # Regenerate datasheet view
        self.create_datasheet_view()

    def annotate(self, suffix, checktime):
        # Pull results back from datasheet_anno.json.  Do NOT load this
        # file if it predates the unannotated datasheet (that indicates
        # simulator failure, and no results).
        dspath = os.path.split(self.cur_datasheet)[0]
        dsdir = dspath + '/ngspice/char'
        anno = dsdir + '/datasheet_' + suffix + '.json'
        unanno = dsdir + '/datasheet.json'

        if os.path.exists(anno):
            statbuf = os.stat(anno)
            mtimea = statbuf.st_mtime
            if checktime >= mtimea:
                # print('original = ' + str(checktime) + ' annotated = ' + str(mtimea))
                print('Error in simulation, no update to results.', file=sys.stderr)
            elif statbuf.st_size == 0:
                print('Error in simulation, no results.', file=sys.stderr)
            else:
                with open(anno, 'r') as file:
                    self.datatop = json.load(file)
        else:
            print('Error in simulation, no update to results.', file=sys.stderr)

        # Regenerate datasheet view
        self.create_datasheet_view()

        # Close log file, if it was enabled in the settings
        self.logstop()

    def save_results(self):
        # Write datasheet_save with all the locally processed results.
        dspath = os.path.split(self.cur_datasheet)[0]
        dsdir = dspath + '/ngspice/char'

        if self.origin.get() == 'Layout Extracted':
            jsonfile = dsdir + '/datasheet_lsave.json'
        else:
            jsonfile = dsdir + '/datasheet_save.json'

        with open(jsonfile, 'w') as ofile:
            json.dump(self.datatop, ofile, indent = 4)
        self.last_save = os.path.getmtime(jsonfile)

        # Create copy of datasheet without result data.  This is
        # the file appropriate to insert into the IP catalog
        # metadata JSON file.

        datacopy = copy.copy(self.datatop)
        dsheet = datacopy['data-sheet']
        if 'electrical-params' in dsheet:
            for eparam in dsheet['electrical-params']:
                if 'results' in eparam:
                    eparam.pop('results')

        datacopy.pop('request-hash')
        jsonfile = dsdir + '/datasheet_compact.json'
        with open(jsonfile, 'w') as ofile:
            json.dump(datacopy, ofile, indent = 4)

        print('Characterization results saved.')

    def check_saved(self):
        # Check if there is a file 'datasheet_save' and if it is more
        # recent than 'datasheet_anno'.  If so, return True, else False.

        [dspath, dsname] = os.path.split(self.cur_datasheet)
        dsdir = dspath + '/ngspice/char'

        if self.origin.get() == 'Layout Extracted':
            savefile = dsdir + '/datasheet_lsave.json'
        else:
            savefile = dsdir + '/datasheet_save.json'

        annofile = dsdir + '/datasheet_anno.json'
        if os.path.exists(annofile):
            annotime = os.path.getmtime(annofile)

            # If nothing has been updated since the characterization
            # tool was started, then there is no new information to save.
            if annotime < self.starttime:
                return True

            if os.path.exists(savefile):
                savetime = os.path.getmtime(savefile)
                # return True if (savetime > annotime) else False
                if savetime > annotime:
                    print("Save is more recent than sim, so no need to save.")
                    return True
                else:
                    print("Sim is more recent than save, so need to save.")
                    return False
            else:
                # There is a datasheet_anno file but no datasheet_save,
	        # so there are necessarily unsaved results.
                print("no datasheet_save, so any results have not been saved.")
                return False
        else:
            # There is no datasheet_anno file, so datasheet_save
            # is either current or there have been no simulations.
            print("no datasheet_anno, so there are no results to save.")
            return True

    def callback(self):
        # Check for manual load/save-as status from settings window (callback
        # when the settings window is closed).
        if self.settings.get_loadsave() == True:
            self.bbar.saveas_button.grid(column=2, row=0, padx = 5)
            self.bbar.load_button.grid(column=3, row=0, padx = 5)
        else:
            self.bbar.saveas_button.grid_forget()
            self.bbar.load_button.grid_forget()

    def save_manual(self, value={}):
        dspath = self.cur_datasheet
        # Set initialdir to the project where cur_datasheet is located
        dsparent = os.path.split(dspath)[0]

        datasheet = filedialog.asksaveasfilename(multiple = False,
			initialdir = dsparent,
			confirmoverwrite = True,
			defaultextension = ".json",
			filetypes = (("JSON File", "*.json"),("All Files","*.*")),
			title = "Select filename for saved datasheet.")
        with open(datasheet, 'w') as ofile:
            json.dump(self.datatop, ofile, indent = 4)

    def load_manual(self, value={}):
        dspath = self.cur_datasheet
        # Set initialdir to the project where cur_datasheet is located
        dsparent = os.path.split(dspath)[0]

        datasheet = filedialog.askopenfilename(multiple = False,
			initialdir = dsparent,
			filetypes = (("JSON File", "*.json"),("All Files","*.*")),
			title = "Find a datasheet.")
        if datasheet != '':
            try:
                with open(datasheet, 'r') as file:
                    self.datatop = json.load(file)
            except:
                print('Error in file, no update to results.', file=sys.stderr)

            else:
                # Regenerate datasheet view
                self.create_datasheet_view()

    def load_results(self, value={}):
        # Check if datasheet_save exists and is more recent than the
        # latest design netlist.  If so, load it;  otherwise, not.
        # NOTE:  Name of .spi file comes from the project 'ip-name'
        # in the datasheet.

        [dspath, dsname] = os.path.split(self.cur_datasheet)
        try:
            dsheet = self.datatop['data-sheet']
        except KeyError:
            return

        dsroot = dsheet['ip-name']

        # Remove any existing results from the datasheet records
        self.clear_results(dsheet)

        # Also must be more recent than datasheet
        jtime = os.path.getmtime(self.cur_datasheet)

        # dsroot = os.path.splitext(dsname)[0]

        dsdir = dspath + '/spi'
        if self.origin.get() == 'Layout Extracted':
            spifile = dsdir + '/pex/' + dsroot + '.spi'
            savesuffix = 'lsave'
        else:
            spifile = dsdir + '/' + dsroot + '.spi'
            savesuffix = 'save'

        dsdir = dspath + '/ngspice/char'
        savefile = dsdir + '/datasheet_' + savesuffix + '.json'

        if os.path.exists(savefile):
            savetime = os.path.getmtime(savefile)

        if os.path.exists(spifile):
            spitime = os.path.getmtime(spifile)

            if os.path.exists(savefile):
                if (savetime > spitime and savetime > jtime):
                    self.annotate(savesuffix, 0)
                    print('Characterization results loaded.')
                    # print('(' + savefile + ' timestamp = ' + str(savetime) + '; ' + self.cur_datasheet + ' timestamp = ' + str(jtime))
                else:
                    print('Saved datasheet is out-of-date, not loading')
            else:
                print('Datasheet file ' + savefile)
                print('No saved datasheet file, nothing to pre-load')
        else:
            print('No netlist file ' + spifile + '!')

        # Remove outdated datasheet.json and datasheet_anno.json to prevent
        # them from overwriting characterization document entries

        if os.path.exists(savefile):
            if savetime < jtime:
                print('Removing outdated save file ' + savefile)
                os.remove(savefile)

        savefile = dsdir + '/datasheet_anno.json'
        if os.path.exists(savefile):
            savetime = os.path.getmtime(savefile)
            if savetime < jtime:
                print('Removing outdated results file ' + savefile)
                os.remove(savefile)

        savefile = dsdir + '/datasheet.json'
        if os.path.exists(savefile):
            savetime = os.path.getmtime(savefile)
            if savetime < jtime:
                print('Removing outdated results file ' + savefile)
                os.remove(savefile)

    def create_datasheet_view(self):
        dframe = self.datasheet_viewer.dframe
 
        # Destroy the existing datasheet frame contents (if any)
        for widget in dframe.winfo_children():
            widget.destroy()
        self.status = {}	# Clear dictionary

        dsheet = self.datatop['data-sheet']
        if 'global-conditions' in dsheet:
            globcond = dsheet['global-conditions']
        else:
            globcond = []

        # Add basic information at the top

        n = 0
        dframe.cframe = ttk.Frame(dframe)
        dframe.cframe.grid(column = 0, row = n, sticky='ewns', columnspan = 10)

        dframe.cframe.plabel = ttk.Label(dframe.cframe, text = 'Project IP name:',
			style = 'italic.TLabel')
        dframe.cframe.plabel.grid(column = 0, row = n, sticky='ewns', ipadx = 5)
        dframe.cframe.pname = ttk.Label(dframe.cframe, text = dsheet['ip-name'],
			style = 'normal.TLabel')
        dframe.cframe.pname.grid(column = 1, row = n, sticky='ewns', ipadx = 5)
        dframe.cframe.fname = ttk.Label(dframe.cframe, text = dsheet['foundry'],
			style = 'normal.TLabel')
        dframe.cframe.fname.grid(column = 2, row = n, sticky='ewns', ipadx = 5)
        dframe.cframe.fname = ttk.Label(dframe.cframe, text = dsheet['node'],
			style = 'normal.TLabel')
        dframe.cframe.fname.grid(column = 3, row = n, sticky='ewns', ipadx = 5)
        if 'decription' in dsheet:
            dframe.cframe.pdesc = ttk.Label(dframe.cframe, text = dsheet['description'],
			style = 'normal.TLabel')
            dframe.cframe.pdesc.grid(column = 4, row = n, sticky='ewns', ipadx = 5)

        if 'UID' in self.datatop:
            n += 1
            dframe.cframe.ulabel = ttk.Label(dframe.cframe, text = 'UID:',
			style = 'italic.TLabel')
            dframe.cframe.ulabel.grid(column = 0, row = n, sticky='ewns', ipadx = 5)
            dframe.cframe.uname = ttk.Label(dframe.cframe, text = self.datatop['UID'],
			style = 'normal.TLabel')
            dframe.cframe.uname.grid(column = 1, row = n, columnspan = 5, sticky='ewns', ipadx = 5)

        n = 1
        ttk.Separator(dframe, orient='horizontal').grid(column=0, row=n, sticky='ewns', columnspan=10)

        # Title block
        n += 1
        dframe.desc_title = ttk.Label(dframe, text = 'Parameter', style = 'title.TLabel')
        dframe.desc_title.grid(column = 0, row = n, sticky='ewns')
        dframe.method_title = ttk.Label(dframe, text = 'Method', style = 'title.TLabel')
        dframe.method_title.grid(column = 1, row = n, sticky='ewns')
        dframe.min_title = ttk.Label(dframe, text = 'Min', style = 'title.TLabel')
        dframe.min_title.grid(column = 2, row = n, sticky='ewns', columnspan = 2)
        dframe.typ_title = ttk.Label(dframe, text = 'Typ', style = 'title.TLabel')
        dframe.typ_title.grid(column = 4, row = n, sticky='ewns', columnspan = 2)
        dframe.max_title = ttk.Label(dframe, text = 'Max', style = 'title.TLabel')
        dframe.max_title.grid(column = 6, row = n, sticky='ewns', columnspan = 2)
        dframe.stat_title = ttk.Label(dframe, text = 'Status', style = 'title.TLabel')
        dframe.stat_title.grid(column = 8, row = n, sticky='ewns')

        if not self.sims_to_go:
            self.allsimbutton = ttk.Button(dframe, text='Simulate All',
			style = 'bluetitle.TButton', command = self.sim_all)
        else:
            self.allsimbutton = ttk.Button(dframe, text='Stop Simulations',
			style = 'redtitle.TButton', command = self.stop_sims)
        self.allsimbutton.grid(column = 9, row=n, sticky='ewns')

        tooltip.ToolTip(self.allsimbutton, text = "Simulate all electrical parameters")

        # Make all columns equally expandable
        for i in range(10):
            dframe.columnconfigure(i, weight = 1)

        # Parse the file for electrical parameters
        n += 1
        binrex = re.compile(r'([0-9]*)\'([bodh])', re.IGNORECASE)
        paramstodo = []
        if 'electrical-params' in dsheet:
            paramstodo.extend(dsheet['electrical-params'])
        if 'physical-params' in dsheet:
            paramstodo.extend(dsheet['physical-params'])

        if self.origin.get() == 'Schematic Capture':
            isschem = True
        else:
            isschem = False

        for param in paramstodo:
            # Fill frame with electrical parameter information
            if 'method' in param:
                p = param['method']
                puniq = p + '.0'
                if puniq in self.status:
                    # This method was used before, so give it a unique identifier
                    j = 1
                    while True:
                        puniq = p + '.' + str(j)
                        if puniq not in self.status:
                            break
                        else:
                            j += 1
                else:
                    j = 0
                paramtype = 'electrical'
            else:
                paramtype = 'physical'
                p = param['condition']
                puniq = paramtype + '.' + p
                j = 0

            if 'editable' in param and param['editable'] == True:
                normlabel   = 'hlight.TLabel'
                redlabel    = 'rhlight.TLabel'
                greenlabel  = 'ghlight.TLabel'
                normbutton  = 'hlight.TButton'
                redbutton   = 'rhlight.TButton'
                greenbutton = 'ghlight.TButton'
            else:
                normlabel   = 'normal.TLabel'
                redlabel    = 'red.TLabel'
                greenlabel  = 'green.TLabel'
                normbutton  = 'normal.TButton'
                redbutton   = 'red.TButton'
                greenbutton = 'green.TButton'

            if 'display' in param:
                dtext = param['display']
            else:
                dtext = p

            # Special handling:  Change LVS_errors to "device check" when using
            # schematic netlist.
            if paramtype == 'physical':
                if isschem:
                    if p == 'LVS_errors':
                        dtext = 'Invalid device check'

            dframe.description = ttk.Label(dframe, text = dtext, style = normlabel)

            dframe.description.grid(column = 0, row=n, sticky='ewns')
            dframe.method = ttk.Label(dframe, text = p, style = normlabel)
            dframe.method.grid(column = 1, row=n, sticky='ewns')
            if 'plot' in param:
                status_style = normlabel
                dframe.plots = ttk.Frame(dframe)
                dframe.plots.grid(column = 2, row=n, columnspan = 6, sticky='ewns')
                plotrec = param['plot']
                if 'status' in plotrec:
                    status_value = plotrec['status']
                else:
                    status_value = '(not checked)'
                dframe_plot = ttk.Label(dframe.plots, text=plotrec['filename'],
				style = normlabel)
                dframe_plot.grid(column = j, row = n, sticky='ewns')
            else:
                # For schematic capture, mark physical parameters that can't and won't be
                # checked as "not applicable".
                status_value = '(not checked)'
                if paramtype == 'physical':
                    if isschem:
                       if p == 'area' or p == 'width' or p == 'height' or p == 'DRC_errors':
                           status_value = '(N/A)'

                if 'min' in param:
                    status_style = normlabel
                    pmin = param['min']
                    if 'target' in pmin:
                        if 'unit' in param and not binrex.match(param['unit']):
                            targettext = pmin['target'] + ' ' + param['unit']
                        else:
                            targettext = pmin['target']
                        # Hack for use of min to change method of scoring
                        if not 'penalty' in pmin or pmin['penalty'] != '0':
                            dframe.min = ttk.Label(dframe, text=targettext, style = normlabel)
                        else:
                            dframe.min = ttk.Label(dframe, text='(no limit)', style = normlabel)
                    else:
                        dframe.min = ttk.Label(dframe, text='(no limit)', style = normlabel)
                    if 'score' in pmin:
                        if pmin['score'] != 'fail':
                            status_style = greenlabel
                            if status_value != 'fail':
                                status_value = 'pass'
                        else:
                            status_style = redlabel
                            status_value = 'fail'
                    if 'value' in pmin:
                        if 'unit' in param and not binrex.match(param['unit']):
                            valuetext = pmin['value'] + ' ' + param['unit']
                        else:
                            valuetext = pmin['value']
                        dframe.value = ttk.Label(dframe, text=valuetext, style=status_style)
                        dframe.value.grid(column = 3, row=n, sticky='ewns')
                else:
                    dframe.min = ttk.Label(dframe, text='(no limit)', style = normlabel)
                dframe.min.grid(column = 2, row=n, sticky='ewns')
                if 'typ' in param:
                    status_style = normlabel
                    ptyp = param['typ']
                    if 'target' in ptyp:
                        if 'unit' in param and not binrex.match(param['unit']):
                            targettext = ptyp['target'] + ' ' + param['unit']
                        else:
                            targettext = ptyp['target']
                        dframe.typ = ttk.Label(dframe, text=targettext, style = normlabel)
                    else:
                        dframe.typ = ttk.Label(dframe, text='(no target)', style = normlabel)
                    if 'score' in ptyp:
                        # Note:  You can't fail a "typ" score, but there is only one "Status",
                        # so if it is a "fail", it must remain a "fail".
                        if ptyp['score'] != 'fail':
                            status_style = greenlabel
                            if status_value != 'fail':
                                status_value = 'pass'
                        else:
                            status_style = redlabel
                            status_value = 'fail'
                    if 'value' in ptyp:
                        if 'unit' in param and not binrex.match(param['unit']):
                            valuetext = ptyp['value'] + ' ' + param['unit']
                        else:
                            valuetext = ptyp['value']
                        dframe.value = ttk.Label(dframe, text=valuetext, style=status_style)
                        dframe.value.grid(column = 5, row=n, sticky='ewns')
                else:
                    dframe.typ = ttk.Label(dframe, text='(no target)', style = normlabel)
                dframe.typ.grid(column = 4, row=n, sticky='ewns')
                if 'max' in param:
                    status_style = normlabel
                    pmax = param['max']
                    if 'target' in pmax:
                        if 'unit' in param and not binrex.match(param['unit']):
                            targettext = pmax['target'] + ' ' + param['unit']
                        else:
                            targettext = pmax['target']
                        # Hack for use of max to change method of scoring
                        if not 'penalty' in pmax or pmax['penalty'] != '0':
                            dframe.max = ttk.Label(dframe, text=targettext, style = normlabel)
                        else:
                            dframe.max = ttk.Label(dframe, text='(no limit)', style = normlabel)
                    else:
                        dframe.max = ttk.Label(dframe, text='(no limit)', style = normlabel)
                    if 'score' in pmax:
                        if pmax['score'] != 'fail':
                            status_style = greenlabel
                            if status_value != 'fail':
                                status_value = 'pass'
                        else:
                            status_style = redlabel
                            status_value = 'fail'
                    if 'value' in pmax:
                        if 'unit' in param and not binrex.match(param['unit']):
                            valuetext = pmax['value'] + ' ' + param['unit']
                        else:
                            valuetext = pmax['value']
                        dframe.value = ttk.Label(dframe, text=valuetext, style=status_style)
                        dframe.value.grid(column = 7, row=n, sticky='ewns')
                else:
                    dframe.max = ttk.Label(dframe, text='(no limit)', style = normlabel)
                dframe.max.grid(column = 6, row=n, sticky='ewns')

            if paramtype == 'electrical':
                if 'hints' in param:
                    simtext = '\u2022Simulate'
                else:
                    simtext = 'Simulate'
            else:
                simtext = 'Check'

            simbutton = ttk.Menubutton(dframe, text=simtext, style = normbutton)

            # Generate pull-down menu on Simulate button.  Most items apply
            # only to electrical parameters (at least for now)
            simmenu = tkinter.Menu(simbutton)
            simmenu.add_command(label='Run',
			command = lambda puniq=puniq: self.sim_param(puniq))
            simmenu.add_command(label='Stop', command = self.stop_sims)
            if paramtype == 'electrical':
                simmenu.add_command(label='Hints',
			command = lambda param=param, simbutton=simbutton: self.add_hints(param, simbutton))
                simmenu.add_command(label='Edit',
			command = lambda param=param: self.edit_param(param))
                simmenu.add_command(label='Copy',
			command = lambda param=param: self.copy_param(param))
                if 'editable' in param and param['editable'] == True:
                    simmenu.add_command(label='Delete',
				command = lambda param=param: self.delete_param(param))

            # Attach the menu to the button
            simbutton.config(menu=simmenu)

            # simbutton = ttk.Button(dframe, text=simtext, style = normbutton)
            #		command = lambda puniq=puniq: self.sim_param(puniq))

            simbutton.grid(column = 9, row=n, sticky='ewns')

            if paramtype == 'electrical':
                tooltip.ToolTip(simbutton, text = "Simulate one electrical parameter")
            else:
                tooltip.ToolTip(simbutton, text = "Check one physical parameter")

            # If 'pass', then just display message.  If 'fail', then create a button that
            # opens and configures the failure report window.
            if status_value == '(not checked)':
                bstyle=normbutton
                stat_label = ttk.Label(dframe, text=status_value, style=bstyle)
            else:
                if status_value == 'fail':
                    bstyle=redbutton
                else:
                    bstyle=greenbutton
                if paramtype == 'electrical':
                    stat_label = ttk.Button(dframe, text=status_value, style=bstyle,
				command = lambda param=param, globcond=globcond:
				self.failreport.display(param, globcond,
				self.cur_datasheet))
                elif p == 'LVS_errors':
                    dspath = os.path.split(self.cur_datasheet)[0]
                    datasheet = os.path.split(self.cur_datasheet)[1]
                    dsheet = self.datatop['data-sheet']
                    designname = dsheet['ip-name']
                    if self.origin.get() == 'Schematic Capture':
                        lvs_file = dspath + '/mag/precheck.log'
                    else:
                        lvs_file = dspath + '/mag/comp.out'
                    if not os.path.exists(lvs_file):
                        if os.path.exists(dspath + '/mag/precheck.log'):
                            lvs_file = dspath + '/mag/precheck.log'
                        elif os.path.exists(dspath + '/mag/comp.out'):
                            lvs_file = dspath + '/mag/comp.out'

                    stat_label = ttk.Button(dframe, text=status_value, style=bstyle,
				command = lambda lvs_file=lvs_file: self.textreport.display(lvs_file))
                else:
                    stat_label = ttk.Label(dframe, text=status_value, style=bstyle)
                tooltip.ToolTip(stat_label,
			text = "Show detail view of simulation conditions and results")
            stat_label.grid(column = 8, row=n, sticky='ewns')
            self.status[puniq] = stat_label
            n += 1

        for child in dframe.winfo_children():
            child.grid_configure(ipadx = 5, ipady = 1, padx = 2, pady = 2)

        # Check if a design submission and characterization may be in progress.
        # If so, add the progress bar at the bottom.
        self.check_ongoing_upload()

if __name__ == '__main__':
    faulthandler.register(signal.SIGUSR2)
    options = []
    arguments = []
    for item in sys.argv[1:]:
        if item.find('-', 0) == 0:
            options.append(item)
        else:
            arguments.append(item)

    root = tkinter.Tk()
    app = OpenGalaxyCharacterize(root)
    if arguments:
        print('Calling set_datasheet with argument ' + arguments[0])
        app.set_datasheet(arguments[0])

    root.mainloop()
