#!/bin/env python3
# Copyright 2020 Efabless Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

#
# set_user_id.py ---
#
# Manipulate the magic database, GDS, and verilog source files for the
# user_id_programming block to set the user ID number.
#
# The user ID number is a 32-bit value that is passed to this routine
# as an integer.
#
# user_id_programming layout map:
# Positions marked (in microns) for value = 0.  For value = 1, move
# the via 0.92um to the left.
#
# Layout grid is 0.46um x 0.34um with half-pitch offset (0.23um, 0.17um)
#
# Signal        Via position (um)
# name		X      Y     
#--------------------------------
# mask_rev[0]   14.49  9.35
# mask_rev[1]	16.33  9.35
# mask_rev[2]	10.35 20.23
# mask_rev[3]	 8.05  9.35
# mask_rev[4]	28.29  9.35
# mask_rev[5]	21.85 25.67
# mask_rev[6]	 8.05 20.23
# mask_rev[7]   20.47  9.35
# mask_rev[8]   17.25 17.85
# mask_rev[9]   25.53 12.07
# mask_rev[10]  22.31 20.23
# mask_rev[11]  13.11  9.35
# mask_rev[12]	23.69 23.29
# mask_rev[13]	24.15 12.07
# mask_rev[14]	13.57 17.85
# mask_rev[15]	23.23  6.97
# mask_rev[16]	24.15 17.85
# mask_rev[17]	 8.51 17.85
# mask_rev[18]	23.69 20.23
# mask_rev[19]	10.81 23.29
# mask_rev[20]	14.95  6.97
# mask_rev[21]	18.17 23.29
# mask_rev[22]	21.39 17.85
# mask_rev[23]	26.45 25.67
# mask_rev[24]	 9.89 17.85
# mask_rev[25]	15.87 17.85
# mask_rev[26]	26.45 17.85
# mask_rev[27]	 8.51  6.97
# mask_rev[28]	10.81  9.35
# mask_rev[29]	27.83 20.23
# mask_rev[30]	16.33 23.29
# mask_rev[31]	 8.05 14.79
#--------------------------------

import os
import sys
import re

def usage():
    print("set_user_id.py <user_id_value> [<path_to_project>]")
    return 0

if __name__ == '__main__':

    # Coordinate pairs in microns for the zero position on each bit
    mask_rev = (
	(14.49,  9.35), (16.33,  9.35), (10.35, 20.23), ( 8.05,  9.35),
	(28.29,  9.35), (21.85, 25.67), ( 8.05, 20.23), (20.47,  9.35),
	(17.25, 17.85), (25.53, 12.07), (22.31, 20.23), (13.11,  9.35),
	(23.69, 23.29), (24.15, 12.07), (13.57, 17.85), (23.23,  6.97),
	(24.15, 17.85), ( 8.51, 17.85), (23.69, 20.23), (10.81, 23.29),
	(14.95,  6.97), (18.17, 23.29), (21.39, 17.85), (26.45, 25.67),
	( 9.89, 17.85), (15.87, 17.85), (26.45, 17.85), ( 8.51,  6.97),
	(10.81,  9.35), (27.83, 20.23), (16.33, 23.29), ( 8.05, 14.79));

    optionlist = []
    arguments = []

    debugmode = False

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

    if len(arguments) != 1 and len(arguments) != 2:
        if len(arguments) != 0:
            print("Wrong number of arguments given to cleanup_unref.py.")
        usage()
        sys.exit(0)

    if '-debug' in optionlist:
        debugmode = True

    user_id_value = arguments[0]

    # Convert to binary
    user_id_bits = '{0:032b}'.format(int(user_id_value))

    if len(arguments) == 2:
        user_project_path = arguments[1]
    else:
        user_project_path = os.getcwd()

    magpath = user_project_path + '/mag'
    gdspath = user_project_path + '/gds'
    vpath = user_project_path + '/verilog'
    errors = 0 

    if os.path.isdir(gdspath):

        # Bytes leading up to via position are:
        viarec = "00 06 0d 02 00 43 00 06 0e 02 00 2c 00 2c 10 03 "
        viabytes = bytes.fromhex(viarec)

        # Read the GDS file.  If a backup was made of the zero-value
        # program, then use it.

        gdsbak = gdspath + '/user_id_prog_zero.gds'
        gdsfile = gdspath + '/user_id_programming.gds'

        if os.path.isfile(gdsbak):
            with open(gdsbak, 'rb') as ifile:
                gdsdata = ifile.read()
        else:
            with open(gdsfile, 'rb') as ifile:
                gdsdata = ifile.read()

        for i in range(0,32):
            # Ignore any zero bits.
            if user_id_bits[i] == '0':
                continue

            coords = mask_rev[i]
            xum = coords[0]
            yum = coords[1]

            # Contact is 0.17 x 0.17, so add and subtract 0.085 to get
            # the corner positions.

            xllum = xum - 0.085
            yllum = yum - 0.085
            xurum = xum + 0.085
            yurum = yum + 0.085
 
            # Get the 4-byte hex values for the corner coordinates
            xllnm = round(xllum * 1000)
            yllnm = round(yllum * 1000)
            xllhex = '{0:08x}'.format(xllnm)
            yllhex = '{0:08x}'.format(yllnm)
            xurnm = round(xurum * 1000)
            yurnm = round(yurum * 1000)
            xurhex = '{0:08x}'.format(xurnm)
            yurhex = '{0:08x}'.format(yurnm)

            # Magic's GDS output for vias always starts at the lower left
            # corner and goes counterclockwise, repeating the first point.
            viaoldposdata = viarec + xllhex + yllhex + xurhex + yllhex
            viaoldposdata += xurhex + yurhex + xllhex + yurhex + xllhex + yllhex
            
            # For "one" bits, the X position is moved 0.92 microns to the left
            newxllum = xllum - 0.92
            newxurum = xurum - 0.92

            # Get the 4-byte hex values for the new corner coordinates
            newxllnm = round(newxllum * 1000)
            newxllhex = '{0:08x}'.format(newxllnm)
            newxurnm = round(newxurum * 1000)
            newxurhex = '{0:08x}'.format(newxurnm)

            vianewposdata = viarec + newxllhex + yllhex + newxurhex + yllhex
            vianewposdata += newxurhex + yurhex + newxllhex + yurhex + newxllhex + yllhex

            # Diagnostic
            if debugmode:
                print('Bit ' + str(i) + ':')
                print('Via position ({0:3.2f}, {1:3.2f}) to ({2:3.2f}, {3:3.2f})'.format(xllum, yllum, xurum, yurum))
                print('Old hex string = ' + viaoldposdata)
                print('New hex string = ' + vianewposdata)

            # Convert hex strings to byte arrays
            viaoldbytedata = bytearray.fromhex(viaoldposdata)
            vianewbytedata = bytearray.fromhex(vianewposdata)

            # Replace the old data with the new
            if viaoldbytedata not in gdsdata:
                print('Error: via not found for bit position ' + str(i))
                errors += 1 
            else:
                gdsdata = gdsdata.replace(viaoldbytedata, vianewbytedata)

        if errors == 0:
            # Keep a copy of the original 
            if not os.path.isfile(gdsbak):
                os.rename(gdsfile, gdsbak)

            with open(gdsfile, 'wb') as ofile:
                ofile.write(gdsdata)

            print('Done!')
            
        else:
            print('There were errors in processing.  No file written.')
            sys.exit(1)

    else:
        print('No directory ' + gdspath + ' found.')
        sys.exit(1)
    sys.exit(0)
