#!/usr/bin/env python3

# All credits go to https://github.com/The-OpenROAD-Project/OpenROAD-flow/blob/master/flow/util/mergeLef.py
# Efabless doesn't own this script
import re
import sys
import os
import argparse  # argument parsing

# WARNING: this script expects the tech lef first

# Parse and validate arguments
# ==============================================================================
parser = argparse.ArgumentParser(
    description='Merges lefs together')
parser.add_argument('--inputLef', '-i', required=True,
                    help='Input Lef', nargs='+')
parser.add_argument('--outputLef', '-o', required=True,
                    help='Output Lef')
args = parser.parse_args()


print(os.path.basename(__file__),": Merging LEFs")

f = open(args.inputLef[0])
content = f.read()
f.close()

# Remove Last line ending the library
content = re.sub("END LIBRARY","",content)

lefs = args.inputLef[1:]
if len(lefs) == 1:
	lefs = lefs[0].split()

# Iterate through additional lefs
for lefFile in lefs:
  f = open(lefFile)
  snippet = f.read()
  f.close()

  # Match the sites
  pattern = r"^SITE.*?^END\s\S+"
  m = re.findall(pattern, snippet, re.M | re.DOTALL)

  print(os.path.basename(lefFile) + ": SITEs matched found: " + str(len(m)))
  content += "\n".join(m)

  # Match the macros
  pattern = r"^MACRO.*?^END\s\S+"
  m = re.findall(pattern, snippet, re.M | re.DOTALL)

  print(os.path.basename(lefFile) + ": MACROs matched found: " + str(len(m)))
  content += "\n" + "\n".join(m)


content += "\nEND LIBRARY"

f = open(args.outputLef, "w")
f.write(content)
f.close()

print(os.path.basename(__file__),": Merging LEFs complete")
