#!/usr/bin/env python3
#
# insert_property.py:  For the given install path, library name, and cellname,
# find the Magic layout of the cell, and add the specified property string.
# If the property exists and is the same as specified, then it remains the
# same.  If the property exists but has a different value, it is replaced.
# The property is added to the layout in both the mag/ (full) and maglef/
# (abstract) directories.  Option "-maglef" or "-mag" will restrict the
# use to only the view indicated by the option.
# 
# e.g.:
#
# insert_property.py /home/tim/projects/efabless/tech/SkyWater/EFS8A \
#	s8iom0 s8iom0s8_top_gpio "FIXED_BBOX 0 607 15000 40200"

import os
import re
import sys

def addprop(filename, propstring, noupdate):
    with open(filename, 'r') as ifile:
        magtext = ifile.read().splitlines() 

    propname = propstring.split()[0]
    proprex = re.compile('<< properties >>')
    endrex = re.compile('<< end >>')

    in_props = False
    printed = False
    done = False

    with open(filename, 'w') as ofile:
        for line in magtext:
            pmatch = proprex.match(line)
            if pmatch:
                in_props = True
            elif in_props:
                linetok = line.split()
                if linetok[0] == 'string':
                    testname = linetok[1]
                    testval = linetok[2]
                    if testname == propname:
                        if noupdate == False:
                            print('string ' + propstring, file=ofile)
                            printed = True
                        done = True

            ematch = endrex.match(line)
            if ematch:
                if in_props == False:
                    print('<< properties >>', file=ofile)
                if done == False:
                    print('string ' + propstring, file=ofile)

            if not printed:
                print(line, file=ofile)
            printed = False

def usage():
    print("insert_property.py <path_to_pdk> <libname> <cellname> <prop_string> [option]")
    print("  options:")
    print("   -mag      do only for the view in the mag/ directory")
    print("   -maglef   do only for the view in the maglef/ directory")
    print("   -noupdate do not replace the property if it already exists in the file")
    return 0

if __name__ == '__main__':

    options = []
    arguments = []
    for item in sys.argv[1:]:
        if item.find('-', 0) == 0:
            options.append(item)
        else:
            arguments.append(item)

    if len(arguments) < 4:
        print("Not enough options given to insert_property.py.")
        usage()
        sys.exit(0)

    source = arguments[0]
    libname = arguments[1]
    cellname = arguments[2]
    propstring = arguments[3]

    noupdate = True if '-noupdate' in options else False
    fail = 0

    efformat = True if '-ef_format' in options else False

    domag = True
    domaglef = True
    if '-mag' in options and '-maglef' not in options:
        domaglef = False
    if '-maglef' in options and '-mag' not in options:
        domag = False

    if domag:
        if efformat:
            filename = source + '/libs.ref/mag/' + libname + '/' + cellname + '.mag'
        else:
            filename = source + '/libs.ref/' + libname + '/mag/' + cellname + '.mag'

        if os.path.isfile(filename):
            addprop(filename, propstring, noupdate)
        else:
            fail += 1
    else:
        fail += 1

    if domaglef:
        if efformat:
            filename = source + '/libs.ref/maglef/' + libname + '/' + cellname + '.mag'
        else:
            filename = source + '/libs.ref/' + libname + '/maglef/' + cellname + '.mag'

        if os.path.isfile(filename):
            addprop(filename, propstring, noupdate)
        else:
            fail += 1
    else:
        fail += 1

    if fail == 2:
        print('Error:  No layout file in either mag/ or maglef/', file=sys.stderr)
        if efformat:
            print('(' + source + '/libs.ref/mag[lef]/' + libname +
		    '/' + cellname + '.mag)', file=sys.stderr)
        else:
            print('(' + source + '/libs.ref/' + libname + '/mag[lef]/'
		    + cellname + '.mag)', file=sys.stderr)

