# 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.

import argparse

parser = argparse.ArgumentParser(
    description="sets the tracks on a layer to specific value"
)

parser.add_argument("--defFile", "-d", required=True, help="Input DEF")

parser.add_argument("--layer", "-l", required=True, help="layer to change")

parser.add_argument(
    "--valuesFile", "-v", required=True, help="tmp file to read the new value from"
)

parser.add_argument(
    "--originalFile", "-o", required=True, help="tmp file to store the original value"
)


args = parser.parse_args()
def_file_name = args.defFile
layer = args.layer
input_file_name = args.valuesFile
output_file_name = args.originalFile

defFileOpener = open(def_file_name, "r")
if defFileOpener.mode == "r":
    defContent = defFileOpener.read().split("\n")
defFileOpener.close()


inputFileOpener = open(input_file_name, "r")
if inputFileOpener.mode == "r":
    inputXY = inputFileOpener.read().split()
inputFileOpener.close()

printedXY = ["0", "0"]

outOrder = 0
for i in range(len(defContent)):
    if outOrder == 2:
        break
    if defContent[i].find(layer) != -1:
        tmpLine = defContent[i].split(" ")
        if tmpLine[0] != "TRACKS":
            continue
        if tmpLine[1] == "X":
            printedXY[0] = tmpLine[4]
            tmpLine[4] = inputXY[0]
        else:
            printedXY[1] = tmpLine[4]
            tmpLine[4] = inputXY[1]
        defContent[i] = " ".join(tmpLine)
        outOrder += 1
        continue


defFileOpener = open(def_file_name, "w")
defFileOpener.write("\n".join(defContent))
defFileOpener.close()

outputFileOpener = open(output_file_name, "w")
outputFileOpener.write("\n".join(printedXY))
outputFileOpener.close()
