#!/ef/efabless/opengalaxy/venv/bin/python3
"""
cace_gensim.py
This is the main part of the automatic characterization engine.  It takes
a JSON simulation template file as input and parses it for information on
how to construct files for the characterization simulations.  Output is
a number of simulation files (for now, at least, in ng-spice format).

Usage:

cace_gensim.py [<root_path>] [<option> ...]

    <root_path> is the root of all the other path names, if the other
    path names are not full paths.  If the other pathnames are all
    full paths, then <root_path> may be omitted.

options:

   -simdir <path>
        is the location where simulation files and data should be placed.
   -datasheetdir <path>
        is the location of the JSON file describing the characterization
   -testbenchdir <path>
        is the location of the netlists for the characterization methods
   -designdir <path>
        is the location of the netlist for the device-under-test
   -layoutdir <path>
        is the location of the layout netlist for the device-under-test
   -datasheet <name>
        is the name of the datasheet JSON file
   -method <name>, ...
        is a list of one or more names of methods to simulate.  If omitted,
        all methods are run for a complete characterization.
   -local
        indicates that cace_gensim is being run locally, not on the CACE
        server, simulation conditions should be output along with results;
        'local' mode implies that results are not posted to the marketplace
        after simulation, and result files are kept.
   -bypass
        acts like remote CACE by running all simulations in one batch and
        posting to the marketplace.  Does not generate status reports.
   -keep
        test mode:  keep all files after simulation
   -plot
        test mode:  generate plot (.png) files locally
   -nopost
        test mode:  do not post results to the marketplace
   -nosim
        test mode:  set up all files for simulation but do not simulate

Quick local run---Use:

    cace_gensim.py <root_dir> -local -method=<method_name>

e.g.,

    cace_gensim.py ~/design/XBG_1V23LC_V01 -local -method=DCVOLTAGE_VBG.1
"""

import os
import sys
import json
import re
import time
import shutil
import signal
import datetime
import subprocess
import faulthandler
from functools import reduce
from spiceunits import spice_unit_convert
from fix_libdirs import fix_libdirs

import og_config

# Values obtained from og_config:
#
apps_path = og_config.apps_path
launchproc = []

def construct_dut_from_path(pname, pathname, pinlist, foundry, node):
    # Read the indicated file, find the .subckt line, and copy out the
    # pin names and DUT name.  Complain if pin names don't match pin names
    # in the datasheet.
    # NOTE:  There may be more than one subcircuit in the netlist, so
    # insist upon the actual DUT (pname)

    subrex = re.compile('^[^\*]*[ \t]*.subckt[ \t]+(.*)$', re.IGNORECASE)
    noderex = re.compile('\*\*\* Layout tech:[ \t]+([^ \t,]+),[ \t]+foundry[ \t]+([^ \t]+)', re.IGNORECASE)
    outline = ""
    dutname = ""
    if not os.path.isfile(pathname):
        print('Error:  No design netlist file ' + pathname + ' found.')
        return outline

    # First pull in all lines of the file and concatenate all continuation
    # lines.
    with open(pathname, 'r') as ifile:
        duttext = ifile.read()

    dutlines = duttext.replace('\n+', ' ').splitlines()
    found = 0
    for line in dutlines:
        lmatch = noderex.match(line)
        if lmatch:
            nlnode = lmatch.group(1)
            nlfoundry = lmatch.group(2)
            if nlfoundry != foundry:
                print('Error:  Foundry is ' + foundry + ' in spec sheet, ' + nlfoundry + ' in netlist.')
                # Not yet fixed in Electric
                ## return ""
            if nlnode != node:
                # Hack for legacy node name
                if nlnode == 'XH035A' and node == 'XH035':
                    pass
                else:
                    print('Error:  Node is ' + node + ' in spec sheet, ' + nlnode + ' in netlist.')
                    # Not yet fixed in Electric
                    ## return ""
        lmatch = subrex.match(line)
        if lmatch:
            rest = lmatch.group(1) 
            tokens = rest.split()
            dutname = tokens[0]
            if dutname == pname:
                outline = outline + 'X' + dutname + ' '
                for pin in tokens[1:]:
                    upin = pin.upper()
                    try:
                        pinmatch = next(item for item in pinlist if item['name'].upper() == upin)
                    except StopIteration:
                        # Maybe this is not the DUT?
                        found = 0
                        # Try the next line
                        break
                    else:
                        outline = outline + pin + ' '
                        found += 1

    if found == 0 and dutname == "":
        print('File ' + pathname + ' does not contain any subcircuits!')
        raise SyntaxError('File ' + pathname + ' does not contain any subcircuits!')
    elif found == 0:
        if dutname != pname: 
            print('File ' + pathname + ' does not have a subcircuit named ' + pname + '!')
            raise SyntaxError('File ' + pathname + ' does not have a subcircuit named ' + pname + '!')
        else:
            print('Pins in schematic: ' + str(tokens[1:]))
            print('Pins in datasheet: ', end='')
            for pin in pinlist:
                print(pin['name'] + ' ', end='')
            print('')
            print('File ' + pathname + ' subcircuit ' + pname + ' does not have expected pins!')
            raise SyntaxError('File ' + pathname + ' subcircuit ' + pname + ' does not have expected pins!')
    elif found != len(pinlist):
        print('File ' + pathname + ' does not contain the project DUT ' + pname)
        print('or not all pins of the DUT were found.')
        print('Pinlist is : ', end='')
        for pinrec in pinlist:
            print(pinrec['name'] + ' ', end='')
        print('')
         
        print('Length of pinlist is ' + str(len(pinlist)))
        print('Number of pins found in subcircuit call is ' + str(found))
        raise SyntaxError('File ' + pathname + ' does not contain the project DUT!')
    else:
        outline = outline + dutname + '\n'
    return outline

conditiontypes = {
	"VOLTAGE":     1,
	"DIGITAL":     2,
	"CURRENT":     3,
	"RISETIME":    4,
	"FALLTIME":    5,
	"RESISTANCE":  6,
	"CAPACITANCE": 7,
	"TEMPERATURE": 8,
	"FREQUENCY":   9,
	"CORNER":      10,
	"SIGMA":       11,
	"ITERATIONS":  12,
	"TIME":	       13
}

# floating-point numeric sequence generators, to be used with condition generator

def linseq(condition, unit, start, stop, step):
    a = float(start)
    e = float(stop)
    s = float(step)
    while (a < e + s):
        if (a > e):
            yield (condition, unit, stop)
        else:
            yield (condition, unit, str(a))
        a = a + s

def logseq(condition, unit, start, stop, step):
    a = float(start)
    e = float(stop)
    s = float(step)
    while (a < e * s):
        if (a > e):
            yield (condition, unit, stop)
        else:
            yield (condition, unit, str(a))
        a = a * s
    
# binary (integer) numeric sequence generators, to be used with condition generator

def bindigits(n, bits):
    s = bin(n & int("1" * bits, 2))[2:]
    return ("{0:0>%s}" % (bits)).format(s)

def twos_comp(val, bits):
    """compute the 2's compliment of int value val"""
    if (val & (1 << (bits - 1))) != 0: # if sign bit is set e.g., 8bit: 128-255
        val = val - (1 << bits)        # compute negative value
    return val                         # return positive value as is

def bcount(condition, unit, start, stop, step):
    blen = len(start)
    a = eval('0b' + start)
    e = eval('0b' + stop)
    if a > e:
        a = twos_comp(a, blen)
        e = twos_comp(e, blen)
    s = int(step)
    while (a < e + s):
        if (a > e):
            bstr = bindigits(e, blen)
        else:
            bstr = bindigits(a, blen)
        yield (condition, unit, bstr)
        a = a + s

def bshift(condition, unit, start, stop, step):
    a = eval('0b' + start)
    e = eval('0b' + stop)
    if a > e:
        a = twos_comp(a, blen)
        e = twos_comp(e, blen)
    s = int(step)
    while (a < e * s):
        if (a > e):
            bstr = bindigits(e, blen)
        else:
            bstr = bindigits(a, blen)
        yield (condition, unit, bstr)
        a = a * s
    
# define a generator for conditions.  Given a condition (dictionary),
# return (as a yield) each specified condition as a
# 3-tuple (condition_type, value, unit)

def condition_gen(cond):
    lcond = cond['condition']
    if "unit" in cond:
        unit = cond['unit']
    else:
        unit = ''

    if "enum" in cond:
        for i in cond["enum"]:
            yield(lcond, unit, i)
    elif "min" in cond and "max" in cond and "linstep" in cond:
        if unit == "'b" or lcond.split(':', 1)[0] == 'DIGITAL':
            yield from bcount(lcond, unit, cond["min"], cond["max"], cond["linstep"])
        else:
            yield from linseq(lcond, unit, cond["min"], cond["max"], cond["linstep"])
    elif "min" in cond and "max" in cond and "logstep" in cond:
        if unit == "'b" or lcond.split(':', 1)[0] == 'DIGITAL':
            yield from bshift(lcond, unit, cond["min"], cond["max"], cond["logstep"])
        else:
            yield from logseq(lcond, unit, cond["min"], cond["max"], cond["logstep"])
    elif "min" in cond and "max" in cond and "typ" in cond:
        yield(lcond, unit, cond["min"])
        yield(lcond, unit, cond["typ"])
        yield(lcond, unit, cond["max"])
    elif "min" in cond and "max" in cond:
        yield(lcond, unit, cond["min"])
        yield(lcond, unit, cond["max"])
    elif "min" in cond and "typ" in cond:
        yield(lcond, unit, cond["min"])
        yield(lcond, unit, cond["typ"])
    elif "max" in cond and "typ" in cond:
        yield(lcond, unit, cond["typ"])
        yield(lcond, unit, cond["max"])
    elif "min" in cond:
        yield(lcond, unit, cond["min"])
    elif "max" in cond:
        yield(lcond, unit, cond["max"])
    elif "typ" in cond:
        yield(lcond, unit, cond["typ"])

# Find the maximum time to run a simulation.  This is the maximum of:
# (1) maximum value, if method is RISETIME or FALLTIME, and (2) maximum
# RISETIME or FALLTIME of any condition.
#
# "lcondlist" is the list of local conditions extended by the list of
# all global conditions that are not overridden by local values.
#
# NOTE:  This list is limited to rise and fall time values, as they are
# the only time constraints known to cace_gensim at this time.  This list
# will be extended as more simulation methods are added.

def findmaxtime(param, lcondlist):
    maxtime = 0.0
    try:
       simunit = param['unit']
    except KeyError:
       # Plots has no min/max/typ so doesn't require units.
       if 'plot' in param:
           return maxtime

    maxval = 0.0
    found = False
    if 'max' in param:
        prec = param['max']
        if 'target' in prec:
            pmax = prec['target']
            try:
                maxval = float(spice_unit_convert([simunit, pmax], 'time'))
                found = True
            except:
                pass
    if not found and 'typ' in param:
        prec = param['typ']
        if 'target' in prec:
            ptyp = prec['target']
            try:
                maxval = float(spice_unit_convert([simunit, ptyp], 'time'))
                found = True
            except:
                pass
    if not found and 'min' in param:
        prec = param['min']
        if 'target' in prec:
            pmin = prec['target']
            try:
                maxval = float(spice_unit_convert([simunit, pmin], 'time'))
                found = True
            except:
                pass
    if maxval > maxtime:
        maxtime = maxval
    for cond in lcondlist:
        condtype = cond['condition'].split(':', 1)[0]
        # print ('condtype ' + condtype)
        if condtype == 'RISETIME' or condtype == 'FALLTIME':
            condunit = cond['unit']
            maxval = 0.0
            if 'max' in cond:
                maxval = float(spice_unit_convert([condunit, cond['max']], 'time'))
            elif 'enum' in cond:
                maxval = float(spice_unit_convert([condunit, cond['enum'][-1]], 'time'))
            elif 'typ' in cond:
                maxval = float(spice_unit_convert([condunit, cond['typ']], 'time'))
            elif 'min' in cond:
                maxval = float(spice_unit_convert([condunit, cond['min']], 'time'))
            if maxval > maxtime:
                maxtime = maxval

    return maxtime

# Picked up from StackOverflow:  Procedure to remove non-unique entries
# in a list of lists (as always, thanks StackOverflow!).

def uniquify(seq):
    seen = set()
    return [x for x in seq if str(x) not in seen and not seen.add(str(x))]

# Insert hints that have been selected in the characterization tool for
# aid in getting stubborn simulations to converge, or to avoid failures
# due to floating nodes, etc.  The hints are somewhat open-ended and can
# be extended as needed.  NOTE:  Hint "method" selects the parameter
# method and is handled outside this routine, which only adds lines to
# the simulation netlist.

def insert_hints(param, ofile):
    if 'hints' in param:
        phints = param['hints']
        if 'reltol' in phints:
            value = phints['reltol']
            ofile.write('.options reltol = ' + value + '\n')
        if 'rshunt' in phints:
            value = phints['rshunt']
            ofile.write('.options rshunt = ' + value + '\n')
        if 'itl1' in phints:
            value = phints['itl1']
            ofile.write('.options itl1 = ' + value + '\n')
        if 'nodeset' in phints:
            value = phints['nodeset']
            # replace '/' in nodeset with '|' to match character replacement done
            # on the output of magic.
            ofile.write('.nodeset ' + value.replace('/', '|') + '\n')
        if 'include' in phints:
            value = phints['include']
            ofile.write('.include ' + value + '\n')

# Replace the substitution token ${INCLUDE_DUT} with the contents of the DUT subcircuit
# netlist file.  "functional" is a list of IP block names that are to be searched for in
# .include lines in the netlist and replaced with functional view equivalents (if such
# exist).

def inline_dut(filename, functional, rootpath, ofile):
    comtrex = re.compile(r'^\*') # SPICE comment
    inclrex = re.compile(r'[ \t]*\.include[ \t]+["\']?([^"\' \t]+)["\']?', re.IGNORECASE) # SPICE include statement
    braktrex = re.compile(r'([^ \t]+)\[([^ \t])\]', re.IGNORECASE)  # Node name with brackets
    subcrex = re.compile(r'[ \t]*x([^ \t]+)[ \t]+(.*)$', re.IGNORECASE) # SPICE subcircuit line
    librex = re.compile(r'(.*)__(.*)', re.IGNORECASE)
    endrex = re.compile(r'[ \t]*\.end[ \t]*', re.IGNORECASE)
    endsrex = re.compile(r'[ \t]*\.ends[ \t]*', re.IGNORECASE)
    # IP names in the ridiculously complicated form
    # <user_path>/design/ip/<proj_name>/<version>/<spi-type>/<proj_name>/<proj_netlist>
    ippathrex = re.compile(r'(.+)/design/ip/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/ \t]+)')
    locpathrex = re.compile(r'(.+)/design/([^/]+)/spi/([^/]+)/([^/ \t]+)')
    # This form does not appear on servers but is used if an IP block is being prepared locally.
    altpathrex = re.compile(r'(.+)/design/([^/]+)/([^/]+)/([^/]+)/([^/ \t]+)')
    # Local IP names in the form
    # <user_path>/design/<project>/spi/<spi-type>/<proj_netlist>

    # To be completed
    with open(filename, 'r') as ifile:
        nettext = ifile.read()

    netlines = nettext.replace('\n+', ' ').splitlines()
    for line in netlines:
        subsline = line
        cmatch = comtrex.match(line)
        if cmatch:
            print(line, file=ofile)
            continue
        # Check for ".end" which should be removed (but not ".ends", which must remain)
        ematch = endrex.match(line)
        if ematch:
            smatch = endsrex.match(line)
            if not smatch:
                continue
        imatch = inclrex.match(line)
        if imatch:
            incpath = imatch.group(1)
            # Substitution behavior is complicated due to the difference between netlist
            # files from schematic capture vs. layout and read-only vs. read-write IP.
            incroot = os.path.split(incpath)[1]
            incname = os.path.splitext(incroot)[0]
            lmatch = librex.match(incname)
            if lmatch:
                ipname = lmatch.group(2)
            else:
                ipname = incname
            if ipname.upper() in functional:
                # Search for functional view (depends on if this is a read-only IP or 
                # read-write local subcircuit)
                funcpath = None
                ippath = ippathrex.match(incpath)
                if ippath:
                    userpath = ippath.group(1)
                    ipname2 = ippath.group(2)
                    ipversion = ippath.group(3)
                    spitype = ippath.group(4)
                    ipname3 = ippath.group(5)
                    ipnetlist = ippath.group(6)
                    funcpath = userpath + '/design/ip/' + ipname2 + '/' + ipversion + '/spi-func/' + ipname + '.spi' 
                else:
                    locpath = locpathrex.match(incpath)
                    if locpath:
                        userpath = locpath.group(1)
                        ipname2 = locpath.group(2)
                        spitype = locpath.group(3)
                        ipnetlist = locpath.group(4)
                        funcpath = userpath + '/design/' + ipname2 + '/spi/func/' + ipname + '.spi' 
                    else:
                        altpath = altpathrex.match(incpath)
                        if altpath:
                            userpath = altpath.group(1)
                            ipname2 = altpath.group(2)
                            spitype = altpath.group(3)
                            ipname3 = altpath.group(4)
                            ipnetlist = altpath.group(5)
                            funcpath = userpath + '/design/' + ipname2 + '/spi/func/' + ipname + '.spi' 
                        
                funcpath = os.path.expanduser(funcpath)
                if funcpath and os.path.exists(funcpath):
                    print('Subsituting functional view for IP block ' + ipname)
                    print('Original netlist is ' + incpath)
                    print('Functional netlist is ' + funcpath)
                    subsline = '.include ' + funcpath
                elif funcpath:
                    print('Original netlist is ' + incpath)
                    print('Functional view specified but no functional view found.')
                    print('Tried looking for ' + funcpath)
                    print('Retaining original view.')
                else:
                    print('Original netlist is ' + incpath)
                    print('Cannot make sense of netlist path to find functional view.')

        # If include file name is in <lib>__<cell> format (from electric) and the
        # functional view is not, then find the subcircuit call and replace the
        # subcircuit name.  At least at the moment, the vice versa case does not
        # happen.
        smatch = subcrex.match(line)
        if smatch:
            subinst = smatch.group(1)
            tokens = smatch.group(2).split()
            # Need to test for parameters passed to subcircuit.  The actual subcircuit
            # name occurs before any parameters.
            params = []
            pins = []
            for token in tokens:
                if '=' in token:
                    params.append(token)
                else:
                    pins.append(token)

            subname = pins[-1]
            pins = pins[0:-1]
            lmatch = librex.match(subname)
            if lmatch:
                testname = lmatch.group(1)
                if testname.upper() in functional:
                    subsline = 'X' + subinst + ' ' + ' '.join(pins) + ' ' + testname + ' ' + ' '.join(params)

        # Remove any array brackets from node names in the top-level subcircuit, because they
        # interfere with the array notation used by XSPICE which may be present in functional
        # views (replace bracket characters with underscores).
        # subsline = subsline.replace('[', '_').replace(']', '_')
        #
        # Do this *only* when there are no spaces inside the brackets, or else any XSPICE
        # primitives in the netlist containing arrays will get messed up.
        subsline = braktrex.sub(r'\1_\2_', subsline)

        ofile.write(subsline + '\n')

    ofile.write('\n')

# Define how to write a simulation file by making substitutions into a
# template schematic.

def substitute(filename, fileinfo, template, simvals, maxtime, schemline,
		localmode, param):
    """Simulation derived by substitution into template schematic"""

    # Regular expressions
    varex = re.compile(r'(\$\{[^ \}\t]+\})')		# variable name ${name}
    defaultex = re.compile(r'\$\{([^=]+)=([^=\}]+)\}')	# name in ${name=default} format
    condpinex = re.compile(r'\$\{([^:]+):([^:\}]+)\}')	# name in ${cond:pin} format
    condex = re.compile(r'\$\{([^\}]+)\}')		# name in ${cond} format
    sweepex = re.compile(r'\$\{([^\}]+):SWEEP([^\}]+)\}') # name in ${cond:[pin:]sweep} format
    pinex = re.compile(r'PIN:([^:]+):([^:]+)')		# name in ${PIN:pin_name:net_name} format
    funcrex = re.compile(r'FUNCTIONAL:([^:]+)')		# name in ${FUNCTIONAL:ip_name} format
    colonsepex = re.compile(r'^([^:]+):([^:]+)$')	# a:b (colon-separated values)
    vectrex = re.compile(r'([^\[]+)\[([0-9]+)\]')       # pin name is a vector signal
    vect2rex = re.compile(r'([^<]+)<([0-9]+)>')         # pin name is a vector signal (alternate style)
    libdirrex = re.compile(r'.lib[ \t]+(.*)[ \t]+')     # pick up library name from .lib
    vinclrex = re.compile(r'[ \t]*`include[ \t]+"([^"]+)"')	# verilog include statement

    # Information about the DUT
    simfilepath = fileinfo['simulation-path']
    schempath = fileinfo['design-netlist-path']
    schemname = fileinfo['design-netlist-name']
    testbenchpath = fileinfo['testbench-netlist-path']
    rootpath = fileinfo['root-path']
    schempins = schemline.upper().split()[1:-1]
    simpins = [None] * len(schempins)

    suffix = os.path.splitext(template)[1]
    functional = []

    # Read ifile into a list
    # Concatenate any continuation lines
    with open(template, 'r') as ifile:
        simtext = ifile.read()

    simlines = simtext.replace('\n+', ' ').splitlines()

    # Make initial pass over contents of template file, looking for SWEEP
    # entries, and collapse simvals accordingly.

    sweeps = []
    for line in simlines:
        sublist = sweepex.findall(line)
        for pattern in sublist:
            condition = pattern[0]
            try:
                entry = next(item for item in sweeps if item['condition'] == condition)
            except (StopIteration, KeyError):
                print("Did not find condition " + condition + " in sweeps.")
                print("Pattern = " + str(pattern))
                print("Sublist = " + str(sublist))
                print("Sweeps = " + str(sweeps))
                entry = {'condition':condition}
                sweeps.append(entry)

                # Find each entry in simvals with the same condition.
                # Record the minimum, maximum, and step for substitution, at the same
                # time removing that item from the entry.
                lvals = []
                units = ''
                for simval in simvals:
                    try:
                        simrec = next(item for item in simval if item[0] == condition)
                    except StopIteration:
                        print('No condition = ' + condition + ' in record:\n')
                        ptext = str(simval) + '\n'
                        sys.stdout.buffer.write(ptext.encode('utf-8'))
                    else:
                        units = simrec[1]
                        lvals.append(float(simrec[2]))
                        simval.remove(simrec)

                # Remove non-unique entries from lvals
                lvals = list(set(lvals))

                # Now parse lvals for minimum/maximum
                entry['unit'] = units
                minval = min(lvals)
                maxval = max(lvals)
                entry['START'] = str(minval)
                entry['END'] = str(maxval)
                numvals = len(lvals)
                if numvals > 1:
                    entry['STEPS'] = str(numvals)
                    entry['STEP'] = str((maxval - minval) / (numvals - 1))
                else:
                    entry['STEPS'] = "1"
                    entry['STEP'] = str(minval)

    # Remove non-unique entries from simvals
    simvals = uniquify(simvals)

    simnum = 0
    testbenches = []
    for simval in simvals:
        # Create the file
        simnum += 1
        simfilename = simfilepath + '/' + filename + '_' + str(simnum) + suffix
        controlblock = False
        with open(simfilename, 'w') as ofile:
            for line in simlines:

                # Check if the parser is in the ngspice control block section
                if '.control' in line:
                    controlblock = True
                elif '.endc' in line:
                    controlblock = False
                elif controlblock == True:
                    ofile.write('set sqrnoise\n')
                    # This will need to be more nuanced if controlblock is used
                    # to do more than just insert the noise sim hack.
                    controlblock = False

                # This will be replaced
                subsline = line

                # Find all variables to substitute
                for patmatch in varex.finditer(line):
                    pattern = patmatch.group(1)
                    # If variable is in ${x=y} format, it declares a default value
                    # Remove the =y default part and keep it for later if needed.
                    defmatch = defaultex.match(pattern)
                    if defmatch:
                        default = defmatch.group(2)
                        vpattern = '${' + defmatch.group(1) + '}'
                    else:
                        default = []
                        vpattern = pattern

                    repl = []
                    no_repl_ok = False
                    sweeprec = sweepex.match(vpattern)
                    if sweeprec:
                        sweeptype = sweeprec.group(2)
                        condition = sweeprec.group(1)

                        entry = next(item for item in sweeps if item['condition'] == condition)
                        uval = spice_unit_convert((entry['unit'], entry[sweeptype]))
                        repl = str(uval)
                    else:
                        cond = condex.match(vpattern)
                        if cond:
                            condition = cond.group(1)

                            # Check if the condition contains a pin vector
                            lmatch = vectrex.match(condition)
                            if lmatch:
                                pinidx = int(lmatch.group(2))
                                vcondition = lmatch.group(1)
                            else:
                                lmatch = vect2rex.match(condition)
                                if lmatch:
                                    pinidx = int(lmatch.group(2))
                                    vcondition = lmatch.group(1)
                                
                            try:
                                 entry = next((item for item in simval if item[0] == condition))
                            except (StopIteration, KeyError):
                                # check against known names (to-do: change if block to array of procs)
                                if condition == 'N':
                                    repl = str(simnum)
                                elif condition == 'MAXTIME':
                                    repl = str(maxtime)
                                elif condition == 'STEPTIME':
                                    repl = str(maxtime / 100)
                                elif condition == 'DUT_PATH':
                                    repl = schempath + '/' + schemname + '\n'
                                    # DUT_PATH is required and is a good spot to
                                    # insert hints (but deprecated in fafor of INCLUDE_DUT)
                                    insert_hints(param, ofile)
                                elif condition == 'INCLUDE_DUT':
                                    if len(functional) == 0:
                                        repl = '.include ' + schempath + '/' + schemname + '\n'
                                    else:
                                        inline_dut(schempath + '/' + schemname, functional, rootpath, ofile)
                                        repl = '** End of in-line DUT subcircuit'
                                    insert_hints(param, ofile)
                                elif condition == 'DUT_CALL':
                                    repl = schemline
                                elif condition == 'DUT_NAME':
                                    # This verifies pin list of schematic vs. the netlist.
                                    repl = schemline.split()[-1]
                                elif condition == 'FILENAME':
                                    repl = filename
                                elif condition == 'RANDOM':
                                    repl = str(int(time.time() * 1000) & 0x7fffffff)
                                # Stack math operators.  Perform specified math
                                # operation on the last two values and replace.
                                #
                                # Note that ngspice is finicky about space around "=" so
                                # handle this in a way that keeps ngspice happy.
                                elif condition == '+':
                                    smatch = varex.search(subsline)
                                    watchend = smatch.start()
                                    ltok = subsline[0:watchend].replace('=', ' = ').split()
                                    ntok = ltok[:-2]
                                    ntok.append(str(float(ltok[-2]) + float(ltok[-1])))
                                    subsline = ' '.join(ntok).replace(' = ', '=') + line[patmatch.end():]
                                    repl = ''
                                    no_repl_ok = True
                                elif condition == '-':
                                    smatch = varex.search(subsline)
                                    watchend = smatch.start()
                                    ltok = subsline[0:watchend].replace('=', ' = ').split()
                                    ntok = ltok[:-2]
                                    ntok.append(str(float(ltok[-2]) - float(ltok[-1])))
                                    subsline = ' '.join(ntok).replace(' = ', '=') + line[patmatch.end():]
                                    repl = ''
                                    no_repl_ok = True
                                elif condition == '*':
                                    smatch = varex.search(subsline)
                                    watchend = smatch.start()
                                    ltok = subsline[0:watchend].replace('=', ' = ').split()
                                    ntok = ltok[:-2]
                                    ntok.append(str(float(ltok[-2]) * float(ltok[-1])))
                                    subsline = ' '.join(ntok).replace(' = ', '=') + line[patmatch.end():]
                                    repl = ''
                                    no_repl_ok = True
                                elif condition == '/':
                                    smatch = varex.search(subsline)
                                    watchend = smatch.start()
                                    ltok = subsline[0:watchend].replace('=', ' = ').split()
                                    ntok = ltok[:-2]
                                    ntok.append(str(float(ltok[-2]) / float(ltok[-1])))
                                    subsline = ' '.join(ntok).replace(' = ', '=') + line[patmatch.end():]
                                    repl = ''
                                    no_repl_ok = True
                                elif condition == 'MAX':
                                    smatch = varex.search(subsline)
                                    watchend = smatch.start()
                                    ltok = subsline[0:watchend].replace('=', ' = ').split()
                                    ntok = ltok[:-2]
                                    ntok.append(str(max(float(ltok[-2]), float(ltok[-1]))))
                                    subsline = ' '.join(ntok).replace(' = ', '=') + line[patmatch.end():]
                                    repl = ''
                                    no_repl_ok = True
                                elif condition == 'MIN':
                                    smatch = varex.search(subsline)
                                    watchend = smatch.start()
                                    ltok = subsline[0:watchend].replace('=', ' = ').split()
                                    ntok = ltok[:-2]
                                    ntok.append(str(min(float(ltok[-2]), float(ltok[-1]))))
                                    subsline = ' '.join(ntok).replace(' = ', '=') + line[patmatch.end():]
                                    repl = ''
                                    no_repl_ok = True
                                # 'NEG' acts on only the previous value in the string.
                                elif condition == 'NEG':
                                    smatch = varex.search(subsline)
                                    watchend = smatch.start()
                                    ltok = subsline[0:watchend].replace('=', ' = ').split()
                                    ntok = ltok[:-1]
                                    ntok.append(str(-float(ltok[-1])))
                                    subsline = ' '.join(ntok).replace(' = ', '=') + line[patmatch.end():]
                                    repl = ''
                                    no_repl_ok = True
                                elif condition.find('PIN:') == 0:
                                    # Parse for ${PIN:<pin_name>:<net_name>}
                                    # Replace <pin_name> with index of pin from DUT subcircuit
                                    pinrec = pinex.match(condition)
                                    pinname = pinrec.group(1).upper()
                                    netname = pinrec.group(2).upper()
                                    try:
                                       idx = schempins.index(pinname)
                                    except ValueError:
                                       repl = netname
                                    else:
                                       repl = '${PIN}'
                                       simpins[idx] = netname
                                elif condition.find('FUNCTIONAL:') == 0:
                                    # Parse for ${FUNCTIONAL:<ip_name>}
                                    # Add <ip_name> to "functional" array.
                                    # 'FUNCTIONAL' declarations must come before 'INCLUDE_DUT' or else
                                    # substitution will not be made.  'INCLUDE_DUT' must be used in place
                                    # of 'DUT_PATH' to get the correct behavior.
                                    funcrec = funcrex.match(condition)
                                    ipname = funcrec.group(1)
                                    functional.append(ipname.upper())
                                    repl = '** Using functional view for ' + ipname
                                else:
                                    if lmatch:
                                        try:
                                            entry = next((item for item in simval if item[0].split('[')[0].split('<')[0] == vcondition))
                                        except:
                                            # if no match, subsline remains as-is.
                                            pass
                                        else:
                                            # Handle as vector bit slice (see below)
                                            vlen = len(entry[2])
                                            uval = entry[2][(vlen - 1) - pinidx]
                                            repl = str(uval)
                                    # else if no match, subsline remains as-is.

                            else:
                                if lmatch:
                                    # pull signal at pinidx out of the vector.
                                    # Note: DIGITAL assumes binary value.  May want to
                                    # allow general case of real-valued vectors, which would
                                    # require a spice unit conversion routine without indexing.
                                    vlen = len(entry[2])
                                    uval = entry[2][(vlen - 1) - pinidx]
                                else:
                                    uval = spice_unit_convert(entry[1:])
                                repl = str(uval)

                    if not repl and default:
                        # Use default if no match was found and default was specified
                        repl = default

                    if repl:
                        # Make the variable substitution
                        subsline = subsline.replace(pattern, repl)
                    elif not no_repl_ok:
                        print('Warning: Variable ' + pattern + ' had no substitution')

                # Check if ${PIN} are in line.  If so, order by index and
                # rewrite pins in order
                for i in range(len(simpins)):
                    if '${PIN}' in subsline:
                        if simpins[i]:
                            subsline = subsline.replace('${PIN}', simpins[i], 1)
                        else:
                            print("Error:  simpins is " + str(simpins) + '\n')
                            print("        subsline is " + subsline + '\n')
                            print("        i is " + str(i) + '\n')

                # Check for a verilog include file, and if any is found, copy it
                # to the target simulation directory.  Replace any leading path
                # with the local current working directory '.'.
                vmatch = vinclrex.match(subsline)
                if vmatch:
                    incfile = vmatch.group(1)
                    incroot = os.path.split(incfile)[1]
                    curpath = os.path.split(template)[0]
                    incpath = os.path.abspath(os.path.join(curpath, incfile))
                    shutil.copy(incpath, simfilepath + '/' + incroot)
                    subsline = '   `include "./' + incroot + '"'

                # Write the modified output line (with variable substitutions)
                ofile.write(subsline + '\n')

        # Add information about testbench file and conditions to datasheet JSON,
        # which can be parsed by cace_launch.py.
        testbench = {}
        testbench['filename'] = simfilename
        testbench['prefix'] = filename
        testbench['conditions'] = simval
        testbenches.append(testbench)

    return testbenches

# Define how to write simulation devices

def generate_simfiles(datatop, fileinfo, arguments, methods, localmode):

    # pull out the relevant part, which is "data-sheet"
    dsheet = datatop['data-sheet']

    # grab values held in 'fileinfo'
    testbenchpath = fileinfo['testbench-netlist-path']

    # electrical parameter list comes from "methods" if non-NULL.
    # Otherwise, each entry in 'methods' is checked against the
    # electrical parameters.

    if 'electrical-params' in dsheet:
        eparamlist = dsheet['electrical-params']
    else:
        eparamlist = []
    if 'physical-params' in dsheet:
        pparamlist = dsheet['physical-params']
    else:
        pparamlist = []

    # If specific methods are called out for simulation using option "-method=", then
    # generate the list of electrical parameters for those methods only.

    if methods:
        neweparamlist = []
        newpparamlist = []
        for method in methods:
            # If method is <methodname>.<index>, simulate only the <index>th instance of
            # the method.
            if '.' in method:
                (method, index) = method.split('.')
            else:
                index = []

            if method == 'physical':
                usedmethods = list(item for item in pparamlist if item['condition'] == index)
                if not usedmethods:
                    print('Unknown parameter ' + index + ' requested in options.  Ignoring.\n')
                for used in usedmethods:
                    newpparamlist.append(used)

            else:
                usedmethods = list(item for item in eparamlist if item['method'] == method)
                if not usedmethods:
                    print('Unknown method ' + method + ' requested in options.  Ignoring.\n')
                if index:
                    neweparamlist.append(usedmethods[int(index)])
                else:
                    for used in usedmethods:
                        neweparamlist.append(used)

        if not neweparamlist and not newpparamlist:
            print('Warning:  No valid methods given as options, so no simulations will be done.\n')
        if neweparamlist:
            for param in neweparamlist:
                if 'display' in param:
                    ptext = 'Simulating parameter: ' + param['display'] + ' (' + param['method'] + ')\n'
                else:
                    ptext = 'Simulating method: ' + param['method'] + '\n'
                sys.stdout.buffer.write(ptext.encode('utf-8'))
        eparamlist = neweparamlist
        if newpparamlist:
            for param in newpparamlist:
                if 'display' in param:
                    ptext = 'Checking parameter: ' + param['display'] + ' (' + param['condition'] + ')\n'
                else:
                    ptext = 'Checking parameter: ' + param['condition'] + '\n'
                sys.stdout.buffer.write(ptext.encode('utf-8'))
        pparamlist = newpparamlist

    # Diagnostic
    # print('pparamlist:')
    # for param in pparamlist:
    #     ptext = param['condition'] + '\n'
    #     sys.stdout.buffer.write(ptext.encode('utf-8'))
    # print('eparamlist:')
    # for param in eparamlist:
    #     ptext = param['method'] + '\n'
    #     sys.stdout.buffer.write(ptext.encode('utf-8'))

    # major subcategories of "data-sheet"
    gcondlist = dsheet['global-conditions']

    # Make a copy of the pin list in the datasheet, and expand any vectors.
    pinlist = []
    vectrex = re.compile(r"([^\[]+)\[([0-9]+):([0-9]+)\]")
    vect2rex = re.compile(r"([^<]+)\<([0-9]+):([0-9]+)\>")
    for pinrec in dsheet['pins']:
        vmatch = vectrex.match(pinrec['name'])
        if vmatch:
            pinname = vmatch.group(1)
            pinmin = vmatch.group(2)
            pinmax = vmatch.group(3)
            if int(pinmin) > int(pinmax):
                pinmin = vmatch.group(3)
                pinmax = vmatch.group(2)
            for i in range(int(pinmin), int(pinmax) + 1):
                newpinrec = pinrec.copy()
                pinlist.append(newpinrec)
                newpinrec['name'] = pinname + '[' + str(i) + ']'
        else:
            vmatch = vect2rex.match(pinrec['name'])
            if vmatch:
                pinname = vmatch.group(1)
                pinmin = vmatch.group(2)
                pinmax = vmatch.group(3)
                if int(pinmin) > int(pinmax):
                    pinmin = vmatch.group(3)
                    pinmax = vmatch.group(2)
                for i in range(int(pinmin), int(pinmax) + 1):
                    newpinrec = pinrec.copy()
                    pinlist.append(newpinrec)
                    newpinrec['name'] = pinname + '<' + str(i) + '>'
            else:
                pinlist.append(pinrec)

    # Make sure all local conditions define a pin.  Those that are not
    # associated with a pin will have a null string for the pin name.

    for cond in gcondlist:
        # Convert old style (separate condition, pin) to new style
        if 'pin' in cond and cond['pin'] != '':
            if ':' not in cond['condition']:
                cond['condition'] += ':' + cond['pin']
            cond.pop('pin', 0)
        if 'order' not in cond:
            try:
                cond['order'] = conditiontypes[cond['condition']]
            except:
                cond['order'] = 0

    # Find DUT netlist file and capture the subcircuit call line
    schempath = fileinfo['design-netlist-path']
    schemname = fileinfo['design-netlist-name']
    pname = fileinfo['project-name']
    dutpath = schempath + '/' + schemname
    foundry = dsheet['foundry']
    node = dsheet['node']
    try:
        schemline = construct_dut_from_path(pname, dutpath, pinlist, foundry, node)
    except SyntaxError:
        print("Failure to construct a DUT subcircuit.  Does the design have ports?")
        schemline = ''

    if schemline == '':
        # Error finding DUT file.  If only physical parameters are requested, this may
        # not be a failure (e.g., chip top level)
        if len(eparamlist) == 0:
            prescore = 'unknown'
        else:
            prescore = 'fail'
    else:
        prescore = 'pass'

    methodsfound = {}

    # electrical parameter types determine the simulation type.  Simulation
    # types will be broken into individual routines (to be done)

    for param in eparamlist:

        # Break out name, method, and conditions as variables
        simtype = param['method']

        # For methods with ":", the filename is the part before the colon.
        testbench = simtype.split(":")[0]

        # If hint 'method' is applied, append the value to the method name.
        # If no such method exists, flag a warning and revert to the original.

        testbench_orig = None
        if 'hints' in param:
            phints = param['hints']
            if 'method' in phints:
                testbench_orig = testbench
                testbench += phints['method']            

        if testbench == simtype:
            if arguments:
                if simtype not in arguments:
                    continue

            if simtype in methodsfound:
                fnum = methodsfound[simtype]
                fsuffix = '_' + str(fnum)
                methodsfound[simtype] = fnum + 1
            else:
                fsuffix = '_0'
                methodsfound[simtype] = 1
        else:
            if arguments:
                if testbench not in arguments:
                    continue

            if testbench in methodsfound:
                fnum = methodsfound[testbench]
                fsuffix = '_' + str(fnum)
                methodsfound[testbench] = fnum + 1
            else:
                fsuffix = '_0'
                methodsfound[testbench] = 1

        lcondlist = param['conditions']

        # Make sure all local conditions which define a pin are in condition:pin form

        for cond in lcondlist:
            if 'pin' in cond and cond['pin'] != '':
                if not ':' in cond['condition']:
                    cond['condition'] += ':' + cond['pin']
                cond.pop('pin', 0)
            if "order" not in cond:
                if cond["condition"].split(':', 1)[0] in conditiontypes:
                    cond["order"] = conditiontypes[cond["condition"].split(':', 1)[0]]
                else:
                    cond["order"] = 14

        # Append to lcondlist any global conditions that aren't overridden by
        # local values for the electrical parameter's set of conditions.

        grec = []
        for cond in gcondlist:
            try:
                test = next((item for item in lcondlist if item["condition"] == cond["condition"]))
            except StopIteration:
                grec.append(cond)

        lcondlist.extend(grec)	# Note this will permanently alter lcondlist

        # Find the maximum simulation time required by this method
        # Simulations are ordered so that "risetime" and "falltime" simulations
        # on a pin will set the simulation time of any simulation of any other
        # electrical parameter on that same pin.

        maxtime = findmaxtime(param, lcondlist)
        print("maxtime is " + str(maxtime))

        # Sort the list for output conditions, ordering according to 'conditiontypes'.

        list.sort(lcondlist, key=lambda k: k['order'])

        # Find the length of each generator
        cgenlen = []
        for cond in lcondlist:
            cgenlen.append(len(list(condition_gen(cond))))

        # The lengths of all generators multiplied together is the number of
        # simulations to be run
        numsims = reduce(lambda x, y: x * y, cgenlen)
        rlen = [x for x in cgenlen]	# note floor division operator

        # This code repeats each condition as necessary such that the final list
        # (transposed) is a complete set of unique condition combinations.
        cgensim = []
        for i in range(len(rlen)):
            mpre = reduce(lambda x, y: x * y, rlen[0:i], 1)
            mpost = reduce(lambda x, y: x * y, rlen[i + 1:], 1)
            clist = list(condition_gen(lcondlist[i]))
            duplist = [item for item in list(condition_gen(lcondlist[i])) for j in range(mpre)]
            cgensim.append(duplist * mpost)

        # Transpose this list
        simvals = list(map(list, zip(*cgensim)))

        # Generate filename prefix for this electrical parameter
        filename = testbench + fsuffix

        # If methodtype is the name of a schematic netlist, then use
        # it and make substitutions
        # NOTE:  Schematic methods are bundled with the DUT schematic

        template = testbenchpath + '/' + testbench.lower() + '.spi'

        if testbench_orig and not os.path.isfile(template):
            print('Warning:  Alternate testbench ' + testbench + ' cannot be found.')
            print('Reverting to original testbench ' + testbench_orig)
            testbench = testbench_orig
            filename = testbench + fsuffix
            template = testbenchpath + '/' + testbench.lower() + '.spi'

        if os.path.isfile(template):
            param['testbenches'] = substitute(filename, fileinfo, template,
			simvals, maxtime, schemline, localmode, param)

            # For cosimulations, if there is a '.tv' file corresponding to the '.spi' file,
            # then make substitutions as for the .spi file, and place in characterization
            # directory.

            vtemplate = testbenchpath + '/' + testbench.lower() + '.tv'
            if os.path.isfile(vtemplate):
                substitute(filename, fileinfo, vtemplate,
			simvals, maxtime, schemline, localmode, param)

        else:
            print('Error:  No testbench file ' + template + '.')

    for param in pparamlist:
        # Break out name, method, and conditions as variables
        cond = param['condition']
        simtype = 'physical.' + cond

        if arguments:
            if simtype not in arguments:
                continue

        if simtype in methodsfound:
            fnum = methodsfound[simtype]
            fsuffix = '_' + str(fnum)
            methodsfound[simtype] = fnum + 1
        else:
            fsuffix = '_0'
            methodsfound[simtype] = 1

        # Mark parameter as needing checking by cace_launch.
        param['check'] = 'true'

    # Remove "order" keys
    for param in eparamlist:
        lcondlist = param['conditions']
        for cond in lcondlist:
            cond.pop('order', 0)
    gconds = dsheet['global-conditions']
    for cond in gconds:
        cond.pop('order', 0)

    return prescore

def check_layout_out_of_date(spipath, layoutpath):
    # Check if a netlist (spipath) is out-of-date relative to the layouts
    # (layoutpath).  Need to read the netlist and check all of the subcells.
    need_capture = False
    if not os.path.isfile(spipath):
        need_capture = True
    elif not os.path.isfile(layoutpath):
        need_capture = True
    else:
        spi_statbuf = os.stat(spipath)
        lay_statbuf = os.stat(layoutpath)
        if spi_statbuf.st_mtime < lay_statbuf.st_mtime:
            # netlist exists but is out-of-date
            need_capture = True
        else:
            # only found that the top-level-layout is older than the
            # netlist.  Now need to read the netlist, find all subcircuits,
            # and check those dates, too.
            layoutdir = os.path.split(layoutpath)[0]
            subrex = re.compile('^[^\*]*[ \t]*.subckt[ \t]+([^ \t]+).*$', re.IGNORECASE)
            with open(spipath, 'r') as ifile:
                duttext = ifile.read()
            dutlines = duttext.replace('\n+', ' ').splitlines()
            for line in dutlines:
                lmatch = subrex.match(line)
                if lmatch:
                    subname = lmatch.group(1)
                    sublayout = layoutdir + '/' + subname + '.mag'
                    # subcircuits that cannot be found in the current directory are
                    # assumed to be library components and therefore never out-of-date.
                    if os.path.exists(sublayout):
                        sub_statbuf = os.stat(sublayout)
                        if spi_statbuf.st_mtime < lay_statbuf.st_mtime:
                            # netlist exists but is out-of-date
                            need_capture = True
                            break
    return need_capture

def check_schematic_out_of_date(spipath, schempath):
    # Check if a netlist (spipath) is out-of-date relative to the schematics
    # (schempath).  Need to read the netlist and check all of the subcells.
    need_capture = False
    if not os.path.isfile(spipath):
        print('Schematic-captured netlist does not exist.  Need to regenerate.')
        need_capture = True
    elif not os.path.isfile(schempath):
        need_capture = True
    else:
        spi_statbuf = os.stat(spipath)
        sch_statbuf = os.stat(schempath)
        print('DIAGNOSTIC:  Comparing ' + spipath + ' to ' + schempath)
        if spi_statbuf.st_mtime < sch_statbuf.st_mtime:
            # netlist exists but is out-of-date
            print('Netlist is older than top-level schematic')
            need_capture = True
        else:
            print('Netlist is newer than top-level schematic, but must check subcircuits')
            # only found that the top-level-schematic is older than the
            # netlist.  Now need to read the netlist, find all subcircuits,
            # and check those dates, too.
            schemdir = os.path.split(schempath)[0]
            subrex = re.compile('^[^\*]*[ \t]*.subckt[ \t]+([^ \t]+).*$', re.IGNORECASE)
            with open(spipath, 'r') as ifile:
                duttext = ifile.read()

            dutlines = duttext.replace('\n+', ' ').splitlines()
            for line in dutlines:
                lmatch = subrex.match(line)
                if lmatch:
                    subname = lmatch.group(1)
                    # NOTE: Electric uses library:cell internally to track libraries,
                    # and maps the ":" to "__" in the netlist.  Not entirely certain that
                    # the double-underscore uniquely identifies the library:cell. . .
                    librex = re.compile('(.*)__(.*)', re.IGNORECASE)
                    lmatch = librex.match(subname)
                    if lmatch:
                        elecpath = os.path.split(os.path.split(schempath)[0])[0]
                        libname = lmatch.group(1)
                        subschem = elecpath + '/' + libname + '.delib/' + lmatch.group(2) + '.sch'
                    else:
                        libname = {}
                        subschem = schemdir + '/' + subname + '.sch'
                    # subcircuits that cannot be found in the current directory are
                    # assumed to be library components or read-only IP components and
                    # therefore never out-of-date.
                    if os.path.exists(subschem):
                        sub_statbuf = os.stat(subschem)
                        if spi_statbuf.st_mtime < sch_statbuf.st_mtime:
                            # netlist exists but is out-of-date
                            print('Netlist is older than subcircuit schematic ' + subname)
                            need_capture = True
                            break
                    # mapping of characters to what's allowed in SPICE makes finding
                    # the associated schematic file a bit difficult.  Requires wild-card
                    # searching.
                    elif libname:
                        restr = lmatch.group(2) + '.sch'
                        restr = restr.replace('.', '\.')
                        restr = restr.replace('_', '.')
                        schrex = re.compile(restr, re.IGNORECASE)
                        try:
                            liblist = os.listdir(elecpath + '/' + libname + '.delib')
                        except FileNotFoundError:
                            # Potentially could look through the paths in LIBDIR. . .
                            pass
                        else:
                            for file in liblist:
                                lmatch = schrex.match(file)
                                if lmatch:
                                    subschem = elecpath + '/' + libname + '.delib/' + file
                                    sub_statbuf = os.stat(subschem)
                                    if spi_statbuf.st_mtime < sch_statbuf.st_mtime:
                                        # netlist exists but is out-of-date
                                        need_capture = True
                                        print('Netlist is older than subcircuit schematic ' + file)
                                        print('In library ' + libname)
                                    break
    return need_capture

def printwarn(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 layout_netlist_includes(pexnetlist, dspath):
    # Magic does not generate netlist output for LEF-like views unless
    # the option "blackbox on" is passed to ext2spice, in which case it
    # generates stub entries.  When generating a PEX view for simulation,
    # these entries need to be generated then replaced with the correct
    # include statement to the ip/ directory.

    comtrex = re.compile(r'^\*') # SPICE comment
    subcrex = re.compile(r'^[ \t]*x([^ \t]+)[ \t]+(.*)$', re.IGNORECASE) # SPICE subcircuit line
    subrex  = re.compile(r'^[ \t]*.subckt[ \t]+([^ \t]+)[ \t]*([^ \t]+.*)', re.IGNORECASE)
    endsrex = re.compile(r'^[ \t]*\.ends[ \t]*', re.IGNORECASE)

    # Also convert commas from [X,Y] arrays to vertical bars as something
    # that can be converted back as necessary.  ngspice treats commas as
    # special characters for some reason.  ngspice also does not correctly
    # handle slash characters in node names (okay as part of the netlist but
    # fails if used in, say, ".nodeset").  Should be okay to replace all '/'
    # because the layout extracted netlist won't have .include or other
    # entries with filename paths.

    # Find project tech path
    if os.path.exists(dspath + '/.ef-config/techdir'):
        techdir = os.path.realpath(dspath + '/.ef-config/techdir')
        maglefdir = techdir + '/libs.ref/maglef'
    else:
        print('Warning:  Project ' + dspath + ' does not define a target process!')
        techdir = None
        maglefdir = None

    with open(pexnetlist, 'r') as ifile:
        spitext = ifile.read()

    # Find project info file (introduced with FFS, 2/2019.  Does not exist in earlier
    # projects)

    depends = {}
    ipname = ''
    if os.path.exists(dspath + '/.ef-config/info'):
       with open(dspath + '/.ef-config/info', 'r') as ifile:
           infolines = ifile.read().splitlines
           deprec = False
           for line in infolines:
               if 'dependencies:' in line:
                   deprec = True
               if deprec:
                   if 'version' in line:
                       version = line.split()[1].strip("'")
                       if ipname != '':
                           depends[ipname] = version
                           ipname = ''
                       else:
                           print('Error:  Badly formed info file in .ef-config', file=sys.stderr)
                   else:
                       ipname = line.strip(':')

    spilines = spitext.replace('\n+', ' ').replace(',', '|').replace('/','|').splitlines()

    newspilines = []
    extended_names = []
    pinsorts = {}
    inbox = False
    for line in spilines:
        cmatch = comtrex.match(line)
        smatch = subrex.match(line)
        xmatch = subcrex.match(line)
        if 'Black-box' in line:
            inbox = True
        elif not inbox:
            if xmatch:
                # Pull subcircuit name from an 'X' component and see if it matches any of the
                # names that were rewritten in Electric <library>__<cell> style.  If so, replace
                # the subcircuit name with the modified name while preserving the rest of the
                # component line.
                rest = xmatch.group(2).split()
                r1 = list(i for i in rest if '=' not in i)
                r2 = list(i for i in rest if '=' in i)
                subname = r1[-1]
                r1 = r1[0:-1]

                # Re-sort the pins if needed
                if subname in pinsorts:
                    r1 = [r1[i] for i in pinsorts[subname]]

                if subname.upper() in extended_names:
                    newsubname = subname + '__' + subname
                    newspilines.append('X' + xmatch.group(1) + ' ' + ' '.join(r1) + ' ' + newsubname + ' ' + ' '.join(r2))
                else:
                    newspilines.append(line)
            else:
                newspilines.append(line)
        elif cmatch:
            newspilines.append(line)
        elif smatch:
            subname = smatch.group(1)
            pinlist = smatch.group(2).split()
            print("Parsing black-box subcircuit " + subname)
            ippath = '~/design/ip/' + subname
            ipfullpath = os.path.expanduser(ippath)
            if os.path.exists(ipfullpath):
                # Version control:  Use the versions specified in the .ef-config/info
                # version list.  If it does not exist (legacy behavior), then use the
                # method outlined below (finds highest version number available).
                if subname in depends:
                    useversion = str(depends[subname])
                else:
                    versions = os.listdir(ipfullpath)
                    vf = list(float(i) for i in versions)
                    vi = vf.index(max(vf))
                    useversion = versions[vi]

                versionpath = ipfullpath + '/' + useversion

                # First to do:  Check for /spi-stub entry (which is readable), and
                # check if pin order is correct.  Flag a warning if it is not, and
                # save the pin order in a record so that all X records can be pin
                # sorted correctly.

                if os.path.exists(versionpath + '/spi-stub'):
                    stubpath = versionpath + '/spi-stub/' + subname + '/' + subname + '__' + subname + '.spi'
                    # More spice file reading!  This should be quick, as these files have
                    # only a single empty subcircuit in them.
                    found = False
                    with open(stubpath, 'r') as sfile:
                        stubtext = sfile.read()
                        stublines = stubtext.replace('\n+', ' ').replace(',', '|').splitlines()
                        for line in stublines:
                            smatch = subrex.match(line)
                            if smatch:
                                found = True
                                stubname = smatch.group(1) 
                                stublist = smatch.group(2).split()
                                if stubname != subname + '__' + subname:
                                    print('Error:  Looking for subcircuit ' + subname + '__' + subname + ' in file ' + stubpath + ' but found subcircuit ' + stubname + ' instead!')
                                    print("This simulation probably isn't going to go well.")
                                else:
                                    needsort = False
                                    for stubpin, subpin in zip(stublist, pinlist):
                                        if stubpin.upper() != subpin.upper():
                                            print('Warning: pin mismatch between layout and schematic stub header on subcircuit ' + subname)
                                            print('Will sort layout netlist to match.')
                                            print('Correct pin order is: ' + smatch.group(2))
                                            needsort = True
                                            break
                                    if needsort:
                                        pinorder = [i[0] for i in sorted(enumerate(pinlist), key = lambda x:stublist.index(x[1]))]
                                        pinsorts[subname] = pinorder
                                break
                    if not found:
                        print('Error:  Cannot find subcircuit in IP spi-stub entry.') 
                else:
                    print('Warning: IP has no spi-stub entry, cannot verify pin order.')

                if os.path.exists(versionpath + '/spi-rcx'):
                    # This path is restricted and can only be seen by ngspice, which is privileged
                    # to read it.  So we can only assume that it matches the spi-stub entry.
                    # NOTE (10/16/2018): Use unexpanded tilde expression in file.
                    # rcxpath = versionpath + '/spi-rcx/' + subname + '/' + subname + '__' + subname + '.spi'
                    rcxpath = ippath + '/' + useversion + '/spi-rcx/' + subname + '/' + subname + '__' + subname + '.spi'
                    newspilines.append('* Black-box entry replaced by path to RCX netlist')
                    newspilines.append('.include ' + rcxpath)
                    extended_names.append(subname.upper())
                elif os.path.exists(ipfullpath + '/' + useversion + '/spi'):
                    # In a pinch, if there is no spi-rcx, try plain spi
                    # NOTE (10/16/2018): Use unexpanded tilde expression in file.
                    # spipath = versionpath + '/spi/' + subname + '.spi'
                    spipath = ippath + '/' + useversion + '/spi/' + subname + '.spi'
                    newspilines.append('* Black-box entry replaced by path to schematic netlist')
                    newspilines.append('.include ' + spipath)
                else:
                    # Leave as is, and let it force an error
                    newspilines.append(line)
                    inbox = False
            elif maglefdir:
                # Check tech file paths
                found = False
                maglefsubdirs = os.listdir(maglefdir)
                for techsubdir in maglefsubdirs:
                    if not os.path.isdir(maglefdir + '/' + techsubdir):
                        continue
                    # print('Diagnostic:  looking in ' + str(maglefdir) + ' ' + str(techsubdir))
                    maglefcells = os.listdir(maglefdir + '/' + techsubdir)
                    if subname + '.mag' in maglefcells:
                        # print("Diagnostic: Parsing black-box subcircuit " + subname)
                        # print('from tech path ' + maglefdir + '/' + techsubdir)

                        # Like the IP directory, can't read spi/ so have to assume it's there.
                        # Problem---there is no consistency across PDKs for the naming of
                        # files in spi/!

                        newspilines.append('* Need include to schematic netlist for ' + subname)
                        # However, the CDL stub file can be used to check pin order
                        stubpath = techdir + '/libs.ref/cdlStub/' + techsubdir + '/stub.cdl'
                        if os.path.exists(stubpath):
                            # More spice file reading!  This should be quick, as these files have
                            # only a empty subcircuits in them.
                            with open(stubpath, 'r') as sfile:
                                stubtext = sfile.read()
                                stublines = stubtext.replace('\n+', ' ').replace(',', '|').splitlines()
                                for line in spilines:
                                    smatch = subrex.match(line)
                                    if smatch:
                                        stubname = smatch.group(1) 
                                        stublist = smatch.group(2).split()
                                        if stubname == subname:
                                            found = True
                                            needsort = False
                                            for stubpin, subpin in zip(stublist, pinlist):
                                                if stubpin.upper() != subpin.upper():
                                                    print('Warning: pin mismatch between layout and schematic stub header on subcircuit ' + subname)
                                                    print('Will sort layout netlist to match.')
                                                    print('Correct pin order is: ' + smatch.group(2))
                                                    needsort = True
                                                    break
                                            if needsort:
                                                pinorder = [i[0] for i in sorted(enumerate(pinlist), key = lambda x:stublist.index(x[1]))]
                                                pinsorts[subname] = pinorder
                                    if found:
                                        break

                        else:
                            print('No file ' + stubpath + ' found.')
                            print('Failure to find stub netlist for checking pin order.  Good luck.')
                        break

                if not found:
                    print('Error: Subcell ' + subname + ' not found in IP or tech paths.')
                    print('This netlist is not going to simulate correctly.')
                    newspilines.append('* Unknown black-box entry ' + subname)
                    newspilines.append(line)
        elif endsrex.match(line):
            inbox = False

    with open(pexnetlist, 'w') as ofile:
        for line in newspilines:
            print(line, file=ofile)

def regenerate_netlists(localmode, dspath, dsheet):
    # When running locally, 'netlist-source' determines whether to use the
    # layout extracted netlist or the schematic captured netlist.  Also for
    # local running only, regenerate the netlist only if it is out of date,
    # or if the user has selected forced regeneration in the settings.

    dname = dsheet['ip-name']
    magpath = dspath + '/mag/'

    spipath = dspath + '/spi/'		# Schematic netlist for sim
    stubpath = dspath + '/spi/stub/'	# Schematic netlist for LVS
    pexpath = dspath + '/spi/pex/'	# Layout netlist for sim
    lvspath = dspath + '/spi/lvs/'	# Layout netlist for LVS
    vlogpath = dspath + '/verilog/'	# Verilog netlist for sim and LVS

    netlistname = dname + '.spi'
    schnetlist = spipath + netlistname
    stubnetlist = stubpath + netlistname
    pexnetlist = pexpath + netlistname
    laynetlist = lvspath + netlistname

    layoutpath = magpath + dname + '.mag'
    elecpath = dspath + '/elec/' + dname + '.delib'
    schempath = elecpath + '/' + dname + '.sch'
    verilogpath = vlogpath + dname + '.v'
    pathlast = os.path.split(dspath)[1]
    verilogaltpath = vlogpath + pathlast + '/' + dname + '.vgl'
    need_sch_capture = True
    need_stub_capture = True
    need_lay_capture = True
    need_pex_capture = True
    force_regenerate = False

    # Check if datasheet has been marked for forced netlist regeneration
    if 'regenerate' in dsheet:
        if dsheet['regenerate'] == 'force':
            force_regenerate = True

    # If schempath does not exist, check if the .sch file is in a different
    # library.
    if not os.path.exists(schempath):
        print('No schematic in path ' + schempath)
        print('Checking for other library paths.')
        for libname in os.listdir(dspath + '/elec/'):
            if os.path.splitext(libname)[1] == '.delib':
                elecpath = dspath + '/elec/' + libname
                if os.path.exists(elecpath):
                    for schfile in os.listdir(elecpath):
                        if schfile == dname + '.sch':
                            schempath = elecpath + '/' + schfile
                            print('Schematic found in ' + schempath)
                            break

    # Guess the source based on the file or files in the design directory,
    # with preference given to layout.  This may be overridden in local mode.

    if localmode and ('netlist-source' in dsheet) and (not force_regenerate):
        print("Checking for out-of-date netlists.\n")
        netlist_source = dsheet['netlist-source']
        need_sch_capture = check_schematic_out_of_date(schnetlist, schempath)
        need_stub_capture = check_schematic_out_of_date(stubnetlist, schempath)
        if netlist_source == 'layout':
            netlist_path = pexnetlist
            need_pex_capture = check_layout_out_of_date(pexnetlist, layoutpath)
            need_lay_capture = check_layout_out_of_date(laynetlist, layoutpath)
        else:
            netlist_path = schnetlist
            need_lay_capture = False
            need_pex_capture = False
    else:
        if not localmode:
            print("Remote use, ", end='');
        print("forcing regeneration of all netlists.\n")
        if 'netlist-source' in dsheet:
            netlist_source = dsheet['netlist-source']
            if netlist_source == 'layout':
                netlist_path = pexnetlist
            else:
                netlist_path = schnetlist
                need_lay_capture = False
                need_pex_capture = False
        else:
            if os.path.exists(layoutpath):
                netlist_path = pexnetlist
                dsheet['netlist-source'] = 'layout'
            elif os.path.exists(schempath):
                netlist_path = schnetlist
                dsheet['netlist-source'] = 'schematic'
                need_lay_capture = False
                need_pex_capture = False
            elif os.path.exists(verilogpath):
                netlist_path = verilogpath
                dsheet['netlist-source'] = 'verilog'
                need_lay_capture = False
                need_pex_capture = False
                need_sch_capture = False
                need_stub_capture = False
            elif os.path.exists(verilogaltpath):
                netlist_path = verilogaltpath
                dsheet['netlist-source'] = 'verilog'
                need_lay_capture = False
                need_pex_capture = False
                need_sch_capture = False
                need_stub_capture = False

    if need_lay_capture or need_pex_capture:
        # Layout LVS netlist needs regenerating.  Check for magic layout.
        if not os.path.isfile(layoutpath):
            print('Error:  No netlist or layout for project ' + dname + '.')
            print('(layout master file ' + layoutpath + ' not found.)\n')
            return False

        # Check for spi/lvs/ directory
        if not os.path.exists(lvspath):
            os.makedirs(lvspath)

        # Check for spi/pex/ directory
        if not os.path.exists(pexpath):
            os.makedirs(pexpath)

        print("Extracting LVS netlist from layout. . .")
        mproc = subprocess.Popen(['/ef/apps/bin/magic', '-dnull', '-noconsole',
		layoutpath], stdin = subprocess.PIPE, stdout=subprocess.PIPE,
		stderr=subprocess.STDOUT, cwd = dspath + '/mag',
		universal_newlines = True)
        mproc.stdin.write("select top cell\n")
        mproc.stdin.write("expand true\n")
        mproc.stdin.write("extract all\n")
        mproc.stdin.write("ext2spice hierarchy on\n")
        mproc.stdin.write("ext2spice format ngspice\n")
        mproc.stdin.write("ext2spice scale off\n")
        mproc.stdin.write("ext2spice renumber off\n")
        mproc.stdin.write("ext2spice subcircuit on\n")
        mproc.stdin.write("ext2spice global off\n")
        # Don't want black box entries, but create them so that we know which
        # subcircuits are in the ip path, then replace them.
        mproc.stdin.write("ext2spice blackbox on\n")
        if need_lay_capture:
            mproc.stdin.write("ext2spice cthresh infinite\n")
            mproc.stdin.write("ext2spice rthresh infinite\n")
            mproc.stdin.write("ext2spice -o " + laynetlist + "\n")
        if need_pex_capture:
            mproc.stdin.write("ext2spice cthresh 0.005\n")
            mproc.stdin.write("ext2spice rthresh 1\n")
            mproc.stdin.write("ext2spice -o " + pexnetlist + "\n")
        mproc.stdin.write("quit -noprompt\n")
        magout = mproc.communicate()[0]
        printwarn(magout)
        if mproc.returncode != 0:
            print('Magic process returned error code ' + str(mproc.returncode) + '\n')

        if need_lay_capture and not os.path.isfile(laynetlist):
            print('Error:  No LVS netlist extracted from magic.')
        if need_pex_capture and not os.path.isfile(pexnetlist):
            print('Error:  No parasitic extracted netlist extracted from magic.')

        if (mproc.returncode != 0) or (need_lay_capture and not os.path.isfile(laynetlist)) or (need_pex_capture and not os.path.isfile(pexnetlist)):
            return False

        if need_pex_capture and os.path.isfile(pexnetlist):
            print('Generating include statements for read-only IP blocks in layout, if needed')
            layout_netlist_includes(pexnetlist, dspath)

    if need_sch_capture or need_stub_capture:
        # Netlist needs regenerating.  Check for electric schematic
        if not os.path.isfile(schempath):
            if os.path.isfile(verilogpath):
                print('No schematic for project.')
                print('Using verilog netlist ' + verilogpath + ' for simulation and LVS.')
                return verilogpath
            elif os.path.isfile(verilogaltpath):
                print('No schematic for project.')
                print('Using verilog netlist ' + verilogaltpath + ' for simulation and LVS.')
                return verilogaltpath
            else:
                print('Error:  No netlist or schematic for project ' + dname + '.')
                print('(schematic master file ' + schempath + ' not found.)\n')
                print('Error:  No verilog netlist ' + verilogpath + ' or ' + verilogaltpath + ', either.')
                return False

        # Check if there is a .java directory, if not (e.g., for remote CACE),
        # then copy it from the defaults.
        if not os.path.exists(dspath + '/elec/.java'):
            shutil.copytree('/ef/efabless/deskel/dotjava', dspath + '/elec/.java',
			symlinks = True)

    # Fix the LIBDIRS file if needed
    if not os.path.isfile(dspath + '/elec/LIBDIRS'):
        fix_libdirs(dspath, create = True)
    elif need_sch_capture or need_stub_capture:
        fix_libdirs(dspath)

    if need_sch_capture:
        print("Generating simulation netlist from schematic. . .")
        # Generate the netlist
        print('Calling /ef/efabless/bin/elec2spi -o ')
        libpath = os.path.split(schempath)[0]
        libname = os.path.split(libpath)[1]
        print(schnetlist + ' -TS -NTI ' + libname + ' ' + dname + '.sch\n')

        # elec2spi requires that the /spi/ and /spi/stub directory exists
        if not os.path.exists(spipath):
            os.makedirs(spipath)

        eproc = subprocess.Popen(['/ef/efabless/bin/elec2spi',
		'-o', schnetlist, '-TS', '-NTI', libname, dname + '.sch'],
		stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
		cwd = dspath + '/elec')

        elecout = eproc.communicate()[0]
        if eproc.returncode != 0:
            for line in elecout.splitlines():
                print(line.decode('utf-8'))

            print('Electric process returned error code ' + str(eproc.returncode) + '\n')
        else:
            printwarn(elecout)

        if not os.path.isfile(schnetlist):
            print('Error: No netlist found for the circuit!\n')
            print('(schematic netlist for simulation ' + schnetlist + ' not found.)\n')

    if need_stub_capture:
        print("Generating LVS netlist from schematic. . .")
        # Generate the netlist
        print('Calling /ef/efabless/bin/elec2spi -o ')
        libpath = os.path.split(schempath)[0]
        libname = os.path.split(libpath)[1]
        print(stubnetlist + ' -LP -TS -NTI ' + libname + ' ' + dname + '.sch\n')

        # elec2spi requires that the /spi/stub directory exists
        if not os.path.exists(stubpath):
            os.makedirs(stubpath)

        eproc = subprocess.Popen(['/ef/efabless/bin/elec2spi',
		'-o', stubnetlist, '-LP', '-TS', '-NTI', libname, dname + '.sch'],
		stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
		cwd = dspath + '/elec')

        elecout = eproc.communicate()[0]
        if eproc.returncode != 0:
            for line in elecout.splitlines():
                print(line.decode('utf-8'))

            print('Electric process returned error code ' + str(eproc.returncode) + '\n')
        else:
            printwarn(elecout)

        if not os.path.isfile(stubnetlist):
            print('Error: No netlist found for the circuit!\n')
            print('(schematic netlist for LVS ' + stubnetlist + ' not found.)\n')

    if need_sch_capture or need_stub_capture:
        if (not os.path.isfile(schnetlist)) or (not os.path.isfile(stubnetlist)):
            return False

    return netlist_path

def cleanup_exit(signum, frame):
    global launchproc
    print("CACE gensim:  Received termination signal.")
    if launchproc:
        print("CACE gensim:  Stopping simulations now.")
        launchproc.terminate()
    else:
        sys.exit(1)

# Main entry point.  Read arguments, print usage or load the json file
# and call generate_simfiles.

if __name__ == '__main__':
    faulthandler.register(signal.SIGUSR2)
    signal.signal(signal.SIGINT, cleanup_exit)
    signal.signal(signal.SIGTERM, cleanup_exit)

    # Divide up command line into options and arguments
    options = []
    arguments = []
    localmode = False
    for item in sys.argv[1:]:
        if item.find('-', 0) == 0:
            options.append(item)
        else:
            arguments.append(item)

    # Read the JSON file
    root_path = []
    if len(arguments) > 0:
        root_path = str(sys.argv[1])
        arguments = arguments[1:]
    elif len(options) == 0:
        # Print usage information when arguments don't match
        print('Usage:\n')
        print('   ' + str(sys.argv[0]) + ' [root_path] [options ...]')
        print('Where [options ...] are one or more of the following:')
        print(' -simdir <path>')
        print('      is the location where simulation files and data should be placed.')
        print(' -datasheetdir <path>')
        print('      is the location of the JSON file describing the characterization.')
        print(' -testbenchdir <path>')
        print('      is the location of the netlists for the characterization methods.')
        print(' -netlist <path>')
        print('      is the location of the netlist for the device-under-test.')
        print(' -layoutdir <path>')
        print('      is the location of the layout netlist for the device-under-test.')
        print(' -datasheet <name>')
        print('      is the name of the datasheet JSON file.')
        print(' -method <name>, ...')
        print('      is a list of one or more names of methods to simulated.  If omitted,')
        print('      all methods are run for a complete characterization.')
        print(' -local')
        print('      indicates that cace_gensim is being run locally, not on the CACE')
        print('      server, simulation conditions should be output along with results;')
        print('      "local" mode implies that results are not posted to the marketplace')
        print('      after simulation, and result files are kept.')
        print(' -keep')
        print('      test mode:  keep all files after simulation')
        print(' -plot')
        print('      test mode:  generate plot (.png) files locally')
        print(' -nopost')
        print('      test mode:  do not post results to the marketplace')
        print(' -nosim')
        print('      test mode:  set up all files for simulation but do not simulate')
        sys.exit(0)

    simulation_path = []
    datasheet_path = []
    testbench_path = []
    design_path = []
    layout_path = []
    datasheet_name = []
    methods = []
    for option in options[:]:
        result = option.split('=')
        if result[0] == '-simdir':
            simulation_path = result[1]
            options.remove(option)
        elif result[0] == '-datasheetdir':
            datasheet_path = result[1]
            options.remove(option)
        elif result[0] == '-testbenchdir':
            testbench_path = result[1]
            options.remove(option)
        elif result[0] == '-designdir':
            design_path = result[1]
            options.remove(option)
        elif result[0] == '-layoutdir':
            layout_path = result[1]
            options.remove(option)
        elif result[0] == '-datasheet':
            datasheet_name = result[1]
            options.remove(option)
        elif result[0] == '-method':
            methods.append(result[1])
            options.remove(option)
        elif result[0] == '-bypass':
            bypassmode = True
            options.remove(option)
        elif result[0] == '-local':
            localmode = True

    # To be valid, must either have a root path or all other options must have been
    # specified with full paths.
    if not root_path:
        err_result = 1
        if not simulation_path:
            print('Error:  If root_path is not provided, -simdir is required.')
        elif simulation_path[0] != '/':
            print('Error:  If root_path not provided, -simdir must be a full path.')
        if not testbench_path:
            print('Error:  If root_path is not provided, -testbenchdir is required.')
        elif testbench_path[0] != '/':
            print('Error:  If root_path not provided, -testbenchdir must be a full path.')
        if not design_path:
            print('Error:  If root_path is not provided, -designdir is required.')
        elif design_path[0] != '/':
            print('Error:  If root_path not provided, -designdir must be a full path.')
        if not layout_path:
            print('Error:  If root_path is not provided, -layoutdir is required.')
        elif layout_path[0] != '/':
            print('Error:  If root_path not provided, -layoutdir must be a full path.')
        if not datasheet_path:
            print('Error:  If root_path is not provided, -datasheetdir is required.')
        elif datasheet_path[0] != '/':
            print('Error:  If root_path not provided, -datasheetdir must be a full path.')
        else:
            err_result = 0

        if err_result:
            sys.exit(1)

    # Apply defaults where not provided as command-line options
    else:
        if not datasheet_path:
            datasheet_path = root_path
        elif not os.path.isabs(datasheet_path):
            datasheet_path = root_path + '/' + datasheet_path
        if not datasheet_name:
            datasheet_name = 'datasheet.json'
            inputfile = datasheet_path + '/' + datasheet_name
            # 2nd guess:  'project.json'
            if not os.path.isfile(inputfile):
                datasheet_name = 'project.json'
                inputfile = datasheet_path + '/' + datasheet_name
            # 3rd guess (legacy behavior):  project directory name + '.json'
            if not os.path.isfile(inputfile):
                datasheet_name = os.path.split(datasheet_path)[1] + '.json'
                inputfile = datasheet_path + '/' + datasheet_name
            if not os.path.isfile(inputfile):
                # Return to original datasheet name;  error will be generated.
                datasheet_name = 'datasheet.json'
            elif localmode and root_path:
                # Use normal path to local simulation workspace
                simulation_path = root_path + '/ngspice/char'

    # Check that datasheet path exists and that the datasheet is there
    if not os.path.isdir(datasheet_path):
        print('Error:  Path to datasheet ' + datasheet_path + ' does not exist.')
        sys.exit(1)
    if len(os.path.splitext(datasheet_name)) != 2:
        datasheet_name += '.json'
    inputfile = datasheet_path + '/' + datasheet_name
    if not os.path.isfile(inputfile):
        print('Error:  No datasheet file ' + inputfile )
        sys.exit(1)

    with open(inputfile) as ifile:
       datatop = json.load(ifile)

    # Pick up testbench and design paths from options now, since some of them
    # depend on the request-hash value in the JSON file.

    if not simulation_path:
        if 'request-hash' in datatop:
            hashname = datatop['request-hash']
            simulation_path = root_path + '/' + hashname
        elif os.path.isdir(root_path + '/ngspice/char'):
            simulation_path = root_path + '/ngspice/char'
        else:
            simulation_path = root_path
    elif not os.path.isabs(simulation_path):
        simulation_path = root_path + '/' + simulation_path
    if not testbench_path:
        testbench_path = root_path + '/testbench'
    elif not os.path.isabs(testbench_path):
        testbench_path = root_path + '/' + testbench_path
    if not design_path:
        design_path = root_path + '/spi'
    elif not os.path.isabs(design_path):
        design_path = root_path + '/' + design_path
    if not layout_path:
        layout_path = root_path + '/mag'
    elif not os.path.isabs(layout_path):
        layout_path = root_path + '/' + layout_path

    # Project name should be 'ip-name' in datatop['data-sheet']
    try:
        dsheet = datatop['data-sheet']
    except KeyError:
        print('Error:  File ' + inputfile + ' is not a datasheet.\n')
        sys.exit(1)
    try:
        name = dsheet['ip-name']
    except KeyError:
        print('Error:  File ' + inputfile + ' is missing ip-name.\n')
        sys.exit(1)

    if not os.path.isdir(testbench_path):
        print('Warning:  Path ' + testbench_path + ' does not exist.  ' +
			'Testbench files are not available.\n')

    if not os.path.isdir(design_path):
        print('Warning:  Path ' + design_path + ' does not exist.  ' +
			'Netlist files may not be available.\n')

    # Simulation path is where the output is dumped.  If it doesn't
    # exist, then create it.
    if not os.path.isdir(simulation_path):
        print('Creating simulation path ' + simulation_path)
        os.makedirs(simulation_path)

    if not os.path.isdir(layout_path):
        print('Creating layout path ' + layout_path)
        os.makedirs(layout_path)

    if not os.path.exists(layout_path + '/.magicrc'):
        # Make sure correct .magicrc file exists
        configdir = os.path.split(layout_path)[0]
        rcpath = configdir + '/.ef-config/techdir/libs.tech/magic/current'
        pdkname = os.path.split(os.path.realpath(configdir + '/.ef-config/techdir'))[1]
        rcfile = rcpath + '/' + pdkname + '.magicrc'
        if os.path.isdir(rcpath):
            if os.path.exists(rcfile):
                shutil.copy(rcfile, layout_path + '/.magicrc')

    # Find the electrical parameter list.  If it exists, then the
    # template has been loaded.  If not, find the template name,
    # then load it from known templates.  Templates may be local to
    # the simulation files.  Priority is (1) templates known to CACE
    # (for challenges;  cannot be overridden by a user; (2) templates
    # local to the simulation (user-generated)

    if not 'electrical-params' in dsheet and not 'physical-params' in dsheet:
        print('Error: Circuit JSON file does not have a valid characterization template!\n')
        sys.exit(1)

    fullnetlistpath = regenerate_netlists(localmode, root_path, dsheet)
    if not fullnetlistpath:
        sys.exit(1)

    netlistpath, netlistname = os.path.split(fullnetlistpath)

    # If there is a 'hints.json' file in the root path, read it and apply to the
    # electrical parameters.  The file contains exactly one hint record per
    # electrical parameter, although the hint record may be empty.
    if os.path.exists(root_path + '/hints.json'):
        with open(root_path + '/hints.json') as hfile:
            hintlist = json.load(hfile)
            i = 0
            for eparam in dsheet['electrical-params']:
                if not 'hints' in eparam:
                    if hintlist[i]:
                        eparam['hints'] = hintlist[i]
                i += 1

    # Construct fileinfo dictionary
    fileinfo = {}
    fileinfo['project-name'] = name
    fileinfo['design-netlist-name'] = netlistname
    fileinfo['design-netlist-path'] = netlistpath
    fileinfo['testbench-netlist-path'] = testbench_path
    fileinfo['simulation-path'] = simulation_path
    fileinfo['root-path'] = root_path

    # Generate the simulation files
    prescore = generate_simfiles(datatop, fileinfo, arguments, methods, localmode)
    if prescore == 'fail':
        # In case of failure
        options.append('-score=fail')

    # Remove option keys
    if 'keep' in datatop:
        options.append('-keep')
        datatop.pop('keep')
    if 'plot' in datatop:
        options.append('-plot')
        datatop.pop('plot')
    if 'nopost' in datatop:
        options.append('-nopost')
        datatop.pop('nopost')
    if 'nosim' in datatop:
        options.append('-nosim')
        datatop.pop('nosim')

    # Reconstruct the -simdir option for cace_launch
    options.append('-simdir=' + simulation_path)

    # Reconstruct the -layoutdir option for cace_launch
    options.append('-layoutdir=' + layout_path)

    # Reconstruct the -netlistdir option for cace_launch
    options.append('-netlistdir=' + design_path)

    # Reconstruct the -rootdir option for cace_launch
    if root_path:
        options.append('-rootdir=' + root_path)

    # Dump the modified JSON file
    basename = os.path.basename(inputfile)
    outputfile = simulation_path + '/' + basename
    with open(outputfile, 'w') as ofile:
        json.dump(datatop, ofile, indent = 4)

    # Launch simulator as a subprocess and wait for it to finish
    # Waiting is important, as otherwise child processes get detached and it
    # becomes very difficult to find them if the simulation needs to be stopped.
    launchname = apps_path + '/' + 'cace_launch.py'

    # Diagnostic
    print("Running: " + launchname + ' ' + outputfile)
    for a in arguments:
        print(a)
    for o in options:
        print(o)

    with subprocess.Popen([launchname, outputfile, *arguments, *options],
        		stdout=subprocess.PIPE, bufsize = 1,
			universal_newlines=True) as launchproc:
        for line in launchproc.stdout:
            print(line, end='')
            sys.stdout.flush()

        launchproc.stdout.close()
        return_code = launchproc.wait()
        if return_code != 0:
            raise subprocess.CalledProcessError(return_code, launchname)

    sys.exit(0)
