blob: cbe6f90249924056f40d11f714aeb1a3ea6667c4 [file] [log] [blame]
# 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
import os
import re
parser = argparse.ArgumentParser(
description="Converts a magic.drc file to a TritonRoute DRC format file."
)
parser.add_argument("--input_file", "-i", required=True, help="input magic.drc")
parser.add_argument("--output_file", "-o", required=True, help="output magic.tr.drc")
args = parser.parse_args()
input_file = args.input_file
output_file = args.output_file
def cleanup(vio_type):
return (
str(vio_type)
.replace(" ", "_")
.replace(">", "gt")
.replace("<", "lt")
.replace("=", "eq")
.replace("!", "not")
.replace("^", "pow")
.replace(".", "dot")
.replace("-", "_")
.replace("+", "plus")
.replace("(", "")
.replace(")", "")
)
printArr = []
splitLine = "----------------------------------------"
# Converting Magic DRC
if os.path.exists(input_file):
drcFileOpener = open(input_file)
if drcFileOpener.mode == "r":
drcContent = drcFileOpener.read()
drcFileOpener.close()
# design name
# violation message
# list of violations
# Total Count:
pattern = re.compile(r".*\s*\((\S+)\.?\s*[^\(\)]+\)")
if drcContent is not None:
drcSections = drcContent.split(splitLine)
if len(drcSections) > 2:
for i in range(1, len(drcSections) - 1, 2):
vio_name = drcSections[i].strip()
m = pattern.match(vio_name)
if m:
layer = m.group(1).split(".")[0]
message_prefix = (
" violation type: " + cleanup(vio_name) + "\n srcs: N/A N/A\n"
)
for vio in drcSections[i + 1].split("\n"):
vio_cor = vio.strip().replace("um", "").split()
if len(vio_cor) > 3:
vio_line = (
message_prefix
+ " bbox = ( "
+ vio_cor[0]
+ ", "
+ vio_cor[1]
+ " ) - ( "
+ vio_cor[2]
+ ", "
+ vio_cor[3]
+ " ) on Layer "
+ layer
)
printArr.append(vio_line)
else:
printArr.append("Source not found.")
# write into file
outputFileOpener = open(output_file, "w")
outputFileOpener.write("\n".join(printArr))
outputFileOpener.close()