blob: fbe8af637518888355be959b0f8ab885e8d01a35 [file] [log] [blame]
#!/usr/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.
import argparse
import re
import odb
parser = argparse.ArgumentParser(description="Creates obstructions in def files.")
parser.add_argument(
"--lef",
"-l",
nargs="+",
type=str,
default=None,
required=True,
help="LEF file needed to have a proper view of the DEF files.",
)
parser.add_argument(
"--input-def",
"-id",
required=True,
help="DEF view of the design that needs to be obstructed.",
)
parser.add_argument(
"--obstructions",
"-obs",
required=True,
help="Format: layer llx lly urx ury, ... (in microns)",
)
parser.add_argument("--output", "-o", required=True, help="Output DEF file.")
args = parser.parse_args()
input_lef_file_names = args.lef
input_def_file_name = args.input_def
obs_args = args.obstructions
output_def_file_name = args.output
RE_NUMBER = r"[\-]?[0-9]+(\.[0-9]+)?"
RE_OBS = (
r"(?P<layer>\S+)\s+"
+ r"(?P<bbox>"
+ RE_NUMBER
+ r"\s+"
+ RE_NUMBER
+ r"\s+"
+ RE_NUMBER
+ r"\s+"
+ RE_NUMBER
+ r")"
)
obses = obs_args.split(",")
obs_list = []
for obs in obses:
obs = obs.strip()
m = re.match(RE_OBS, obs)
assert (
m
), "Incorrectly formatted input (%s).\n Format: layer llx lly urx ury, ..." % (obs)
layer = m.group("layer")
bbox = [float(x) for x in m.group("bbox").split()]
obs_list.append((layer, bbox))
design_db = odb.dbDatabase.create()
for lef in input_lef_file_names:
odb.read_lef(design_db, lef)
odb.read_def(design_db, input_def_file_name)
design_chip = design_db.getChip()
design_block = design_chip.getBlock()
design_insts = design_block.getInsts()
design_tech = design_db.getTech()
for obs in obs_list:
layer = obs[0]
bbox = obs[1]
dbu = design_tech.getDbUnitsPerMicron()
bbox = [int(x * dbu) for x in bbox]
print("Creating an obstruction on", layer, "at", *bbox, "(DBU)")
odb.dbObstruction_create(design_block, design_tech.findLayer(layer), *bbox)
odb.write_def(design_block, output_def_file_name)