make sure extra lefs/defs is unique to avoid PDN hang
diff --git a/configure.py b/configure.py
index d12a78e..ac0aeeb 100755
--- a/configure.py
+++ b/configure.py
@@ -135,6 +135,16 @@
def __init__(self, projects):
self.projects = projects
+ @classmethod
+ def unique(cls, duplist):
+ unique_list = []
+ # traverse for all elements
+ for x in duplist:
+ # check if exists in unique_list or not
+ if x not in unique_list:
+ unique_list.append(x)
+ return unique_list
+
# create macro file & positions, power hooks
def create_macro_config(self):
start_x = 80
@@ -180,20 +190,30 @@
# extra_lef_gds.tcl
logging.debug("creating extra_lef_gds.tcl")
+ lefs = []
+ gdss = []
+ for i in range(NUM_PROJECTS):
+ lefs.append(self.projects.get_macro_lef_name(i))
+ gdss.append(self.projects.get_macro_gds_name(i))
+
+ # can't have duplicates or OpenLane crashes at PDN
+ lefs = CaravelConfig.unique(lefs)
+ gdss = CaravelConfig.unique(gdss)
+
with open("openlane/user_project_wrapper/extra_lef_gds.tcl", 'w') as fh:
fh.write('set ::env(EXTRA_LEFS) "\\\n')
fh.write("$script_dir/../../lef/scan_controller.lef \\\n")
- for i in range(NUM_PROJECTS):
- fh.write("$script_dir/../../lef/{}".format(self.projects.get_macro_lef_name(i)))
- if i != NUM_PROJECTS - 1:
+ for i, lef in enumerate(lefs):
+ fh.write("$script_dir/../../lef/{}".format(lef))
+ if i != len(lefs) - 1:
fh.write(" \\\n")
else:
fh.write('"\n')
fh.write('set ::env(EXTRA_GDS_FILES) "\\\n')
fh.write("$script_dir/../../gds/scan_controller.gds \\\n")
- for i in range(NUM_PROJECTS):
- fh.write("$script_dir/../../gds/{}".format(self.projects.get_macro_gds_name(i)))
- if i != NUM_PROJECTS - 1:
+ for i, gds in enumerate(gdss):
+ fh.write("$script_dir/../../gds/{}".format(gds))
+ if i != len(gdss) - 1:
fh.write(" \\\n")
else:
fh.write('"\n')
@@ -258,10 +278,15 @@
fh.write(post)
# build the user_project_includes.v file - used for blackboxing when building the GDS
+ verilogs = []
+ for i in range(NUM_PROJECTS):
+ verilogs.append(self.projects.get_verilog_include(i))
+ verilogs = CaravelConfig.unique(verilogs)
+
with open('verilog/rtl/user_project_includes.v', 'w') as fh:
fh.write('`include "scan_controller.v"\n')
- for i in range(NUM_PROJECTS):
- fh.write(self.projects.get_verilog_include(i))
+ for verilog in verilogs:
+ fh.write(verilog)
if __name__ == '__main__':