Merge branch 'develop_newscl' into develop
diff --git a/configuration/floorplan.tcl b/configuration/floorplan.tcl
index 57d49b7..1e68d89 100644
--- a/configuration/floorplan.tcl
+++ b/configuration/floorplan.tcl
@@ -2,6 +2,7 @@
set ::env(FP_IO_VMETAL) 2
set ::env(FP_IO_HMETAL) 3
+set ::env(FP_SIZING) relative
set ::env(FP_CORE_UTIL) 50
set ::env(FP_CORE_MARGIN) 5.52
set ::env(FP_ASPECT_RATIO) 1
diff --git a/configuration/general.tcl b/configuration/general.tcl
index 34d57d3..f11aa93 100644
--- a/configuration/general.tcl
+++ b/configuration/general.tcl
@@ -1,5 +1,5 @@
# default pdk
-set ::env(PDK) "ef-skywater-s8/EFS8A/"
+set ::env(PDK) "EFS8A/"
set ::env(PDK_VARIANT) "scs8hd"
set ::env(PDK_ROOT) $::env(OPENLANE_ROOT)/pdks/
set ::env(USE_GPIO_PADS) 0
diff --git a/designs/striVe_flat/config_mod_diearea.tcl b/designs/striVe_flat/config_mod_diearea.tcl
index 3ba90b9..babb440 100644
--- a/designs/striVe_flat/config_mod_diearea.tcl
+++ b/designs/striVe_flat/config_mod_diearea.tcl
@@ -10,9 +10,9 @@
set ::env(RUN_SIMPLE_CTS) 0
set ::env(FILL_INSERTION) 1
-set ::env(GLB_RT_LI1_ADJUSTMENT) 0.75
-set ::env(GLB_RT_MET1_ADJUSTMENT) 0.75
-set ::env(FP_CORE_MARGIN) 155
+set ::env(GLB_RT_LI1_ADJUSTMENT) 1.0
+set ::env(GLB_RT_MET1_ADJUSTMENT) 1.0
+set ::env(FP_CORE_MARGIN) 162
set ::env(CLOCK_NET) "clk"
#set ::env(SYNTH_TOP_LEVEL) 1
set ::env(USE_GPIO_PADS) 1
diff --git a/designs/striVe_flat/toplevel_mod_diearea.tcl b/designs/striVe_flat/toplevel_mod_diearea.tcl
index 577b90b..18418e7 100644
--- a/designs/striVe_flat/toplevel_mod_diearea.tcl
+++ b/designs/striVe_flat/toplevel_mod_diearea.tcl
@@ -34,5 +34,7 @@
run_placement
gen_pdn
move_pins -from $pinsonly -to $::env(CURRENT_DEF)
+exec python3 $::env(SCRIPTS_DIR)/zeroize_origin_def.py < $::env(CURRENT_DEF) > $::env(CURRENT_DEF).zeroized
+exec mv $::env(CURRENT_DEF).zeroized $::env(CURRENT_DEF)
run_routing
#run_magic
diff --git a/docker_build/Makefile b/docker_build/Makefile
index 5b5a108..aec5207 100644
--- a/docker_build/Makefile
+++ b/docker_build/Makefile
@@ -3,7 +3,7 @@
#ROOT = sudo
#TOOLS = brown_yosys tapcell replace magic cts ioplacer pdn opendp resizer route macroplacer fastroute opensta yosys
-TOOLS = replace ioplacer opendp route fastroute opensta yosys tapcell magic resizer addspacers openroad_flow padring
+TOOLS = replace ioplacer opendp route fastroute opensta yosys tapcell magic resizer addspacers openroad_flow padring netgen vlogtoverilog
TOOL_BUILD_TARGETS = $(foreach tool,$(TOOLS),build-$(tool))
TOOL_EXPORT_TARGETS_PHONY = $(foreach tool,$(TOOLS),export-$(tool))
diff --git a/docker_build/docker/netgen/Dockerfile b/docker_build/docker/netgen/Dockerfile
new file mode 100644
index 0000000..b987f77
--- /dev/null
+++ b/docker_build/docker/netgen/Dockerfile
@@ -0,0 +1,35 @@
+# syntax = docker/dockerfile:1.0-experimental
+FROM centos:centos6 as build
+
+# Common development tools and libraries (kitchen sink approach)
+RUN yum groupinstall -y "Development Tools" "Development Libraries"
+RUN yum -y install centos-release-scl && \
+ yum -y install devtoolset-8 devtoolset-8-libatomic-devel
+
+ENV CC=/opt/rh/devtoolset-8/root/usr/bin/gcc \
+ CPP=/opt/rh/devtoolset-8/root/usr/bin/cpp \
+ CXX="/opt/rh/devtoolset-8/root/usr/bin/g++" \
+ PATH=/opt/rh/devtoolset-8/root/usr/bin:$PATH \
+ LD_LIBRARY_PATH=/opt/rh/devtoolset-8/root/usr/lib64:/opt/rh/devtoolset-8/root/usr/lib:/opt/rh/devtoolset-8/root/usr/lib64/dyninst:/opt/rh/devtoolset-8/root/usr/lib/dyninst:/opt/rh/devtoolset-8/root/usr/lib64:/opt/rh/devtoolset-8/root/usr/lib:$LD_LIBRARY_PATH
+#
+
+# netgen dependencies
+RUN yum install -y csh wget tcl-devel tk-devel libX11-devel cairo-devel ncurses-devel
+
+# git clone netgen components
+RUN git clone https://github.com/RTimothyEdwards/netgen
+
+WORKDIR "netgen"
+
+
+# build
+RUN ./configure --prefix=/build && \
+ make -j4 && \
+ make install
+
+RUN mkdir -p /build/version/
+
+RUN date +"Build Timestamp: %Y-%m-%d_%H-%M-%S" > /build/version/netgen.version
+RUN git rev-parse HEAD >> /build/version/netgen.version
+RUN tar -czf /build.tar.gz /build
+
diff --git a/docker_build/docker/vlogtoverilog/Dockerfile b/docker_build/docker/vlogtoverilog/Dockerfile
new file mode 100644
index 0000000..45e896d
--- /dev/null
+++ b/docker_build/docker/vlogtoverilog/Dockerfile
@@ -0,0 +1,29 @@
+# syntax = docker/dockerfile:1.0-experimental
+FROM centos:centos6 as build
+
+# install gcc 6
+RUN yum -y install centos-release-scl && \
+ yum -y install devtoolset-6 devtoolset-6-libatomic-devel
+ENV CC=/opt/rh/devtoolset-6/root/usr/bin/gcc \
+ CPP=/opt/rh/devtoolset-6/root/usr/bin/cpp \
+ CXX=/opt/rh/devtoolset-6/root/usr/bin/g++ \
+ PATH=/opt/rh/devtoolset-6/root/usr/bin:$PATH \
+ LD_LIBRARY_PATH=/opt/rh/devtoolset-6/root/usr/lib64:/opt/rh/devtoolset-6/root/usr/lib:/opt/rh/devtoolset-6/root/usr/lib64/dyninst:/opt/rh/devtoolset-6/root/usr/lib/dyninst:/opt/rh/devtoolset-6/root/usr/lib64:/opt/rh/devtoolset-6/root/usr/lib:$LD_LIBRARY_PATH
+
+RUN yum install -y git
+RUN cd
+
+RUN git clone https://github.com/RTimothyEdwards/qflow
+
+WORKDIR qflow
+RUN git checkout a550469b63e910ede6e3022e2886bca96462c540
+
+RUN ./configure && cd src && make vlog2Verilog
+
+RUN mkdir -p /build/bin && cp /qflow/src/vlog2Verilog /build/bin/
+
+RUN mkdir -p /build/version/
+RUN date +"Build Timestamp: %Y-%m-%d_%H-%M-%S" > /build/version/vlog2Verilog.version
+RUN git rev-parse HEAD >> /build/version/vlog2Verilog.version
+RUN tar -czf /build.tar.gz /build
+
diff --git a/docker_build/tar/netgen.tar.gz b/docker_build/tar/netgen.tar.gz
new file mode 100644
index 0000000..478c21c
--- /dev/null
+++ b/docker_build/tar/netgen.tar.gz
Binary files differ
diff --git a/docker_build/tar/vlogtoverilog.tar.gz b/docker_build/tar/vlogtoverilog.tar.gz
new file mode 100644
index 0000000..da61a12
--- /dev/null
+++ b/docker_build/tar/vlogtoverilog.tar.gz
Binary files differ
diff --git a/flow.tcl b/flow.tcl
index f4c1dc7..10a861b 100755
--- a/flow.tcl
+++ b/flow.tcl
@@ -20,6 +20,8 @@
run_routing
run_magic
run_magic_drc
+ run_magic_spice_export
+ run_netgen
}
proc run_interactive_mode {args} {
@@ -27,6 +29,40 @@
exec tclsh |& tee /dev/tty
}
+proc run_magic_drc_batch {args} {
+ set options {{-magicrc optional} \
+ {-tech optional} \
+ {-report required} \
+ {-design required} \
+ {-gds required}}
+ set flags {}
+ parse_key_args "run_magic_drc_batch" args arg_values $options flags_mag $flags
+ if { [info exists arg_values(-magicrc)] } {
+ set magicrc [file normalize $arg_values(-magicrc)]
+ }
+ if { [info exists arg_values(-tech)] } {
+ set ::env(TECH) [file normalize $arg_values(-tech)]
+ }
+ set ::env(GDS_INPUT) [file normalize $arg_values(-gds)]
+ set ::env(REPORT_OUTPUT) [file normalize $arg_values(-report)]
+ set ::env(DESIGN_NAME) $arg_values(-design)
+
+ if { [info exists magicrc] } {
+ exec magic \
+ -noconsole \
+ -dnull \
+ -rcfile $magicrc \
+ $::env(OPENLANE_ROOT)/scripts/magic_drc_batch.tcl \
+ </dev/null |& tee /dev/tty
+ } else {
+ exec magic \
+ -noconsole \
+ -dnull \
+ $::env(OPENLANE_ROOT)/scripts/magic_drc_batch.tcl \
+ </dev/null |& /dev/tty
+ }
+}
+
proc run_file {args} {
set ::env(TCLLIBPATH) $::env(OPENLANE_ROOT)/scripts/tcl_commands/
exec tclsh $args |& tee /dev/tty
@@ -39,7 +75,7 @@
}
-set flags {-init_design_config -disable_output -interactive}
+set flags {-init_design_config -disable_output -interactive -drc}
set argv_copy $argv
parse_key_args "flow.tcl" argv arg_values $options flags_map $flags
@@ -50,6 +86,8 @@
} else {
run_interactive_mode "$argv_copy"
}
+} elseif { [info exists flags_map(-drc)] } {
+ run_magic_drc_batch {*}$argv_copy
} else {
run_non_interactive_mode {*}$argv_copy
}
diff --git a/mykey.pub b/mykey.pub
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/mykey.pub
diff --git a/pdks/EFS8A b/pdks/EFS8A
new file mode 120000
index 0000000..dedebb9
--- /dev/null
+++ b/pdks/EFS8A
@@ -0,0 +1 @@
+ef-skywater-s8/EFS8A
\ No newline at end of file
diff --git a/scripts/count_lvs.py b/scripts/count_lvs.py
new file mode 100755
index 0000000..0b5f23e
--- /dev/null
+++ b/scripts/count_lvs.py
@@ -0,0 +1,117 @@
+#!/usr/bin/python3
+#
+#---------------------------------------------------------
+# LVS failure check
+#
+# This is a Python script that parses the comp.json
+# output from netgen and reports on the number of
+# errors in the top-level netlist.
+#
+#---------------------------------------------------------
+# Written by Tim Edwards
+# efabless, inc.
+# Pulled from qflow GUI as standalone script Aug 20, 2018
+#---------------------------------------------------------
+
+import os
+import re
+import sys
+import json
+import argparse
+
+def count_LVS_failures(filename):
+ with open(filename, 'r') as cfile:
+ lvsdata = json.load(cfile)
+
+ # Count errors in the JSON file
+ failures = 0
+ devfail = 0
+ netfail = 0
+ pinfail = 0
+ propfail = 0
+ netdiff = 0
+ devdiff = 0
+ ncells = len(lvsdata)
+ for c in range(0, ncells):
+ cellrec = lvsdata[c]
+
+ if c == ncells - 1:
+ topcell = True
+ else:
+ topcell = False
+
+ # Most errors must only be counted for the top cell, because individual
+ # failing cells are flattened and the matching attempted again on the
+ # flattened netlist.
+
+ if topcell:
+ if 'devices' in cellrec:
+ devices = cellrec['devices']
+ devlist = [val for pair in zip(devices[0], devices[1]) for val in pair]
+ devpair = list(devlist[p:p + 2] for p in range(0, len(devlist), 2))
+ for dev in devpair:
+ c1dev = dev[0]
+ c2dev = dev[1]
+ diffdevs = abs(c1dev[1] - c2dev[1])
+ failures += diffdevs
+ devdiff += diffdevs
+
+ if 'nets' in cellrec:
+ nets = cellrec['nets']
+ diffnets = abs(nets[0] - nets[1])
+ failures += diffnets
+ netdiff += diffnets
+
+ if 'badnets' in cellrec:
+ badnets = cellrec['badnets']
+ failures += len(badnets)
+ netfail += len(badnets)
+
+ if 'badelements' in cellrec:
+ badelements = cellrec['badelements']
+ failures += len(badelements)
+ devfail += len(badelements)
+
+ if 'pins' in cellrec:
+ pins = cellrec['pins']
+ pinlist = [val for pair in zip(pins[0], pins[1]) for val in pair]
+ pinpair = list(pinlist[p:p + 2] for p in range(0, len(pinlist), 2))
+ for pin in pinpair:
+ # Avoid flagging global vs. local names, e.g., "gnd" vs. "gnd!,"
+ # and ignore case when comparing pins.
+ pin0 = re.sub('!$', '', pin[0].lower())
+ pin1 = re.sub('!$', '', pin[1].lower())
+ if pin0 != pin1:
+ failures += 1
+ pinfail += 1
+
+ # Property errors must be counted for every cell
+ if 'properties' in cellrec:
+ properties = cellrec['properties']
+ failures += len(properties)
+ propfail += len(properties)
+
+ return [failures, netfail, devfail, pinfail, propfail, netdiff, devdiff]
+
+if __name__ == '__main__':
+
+ parser = argparse.ArgumentParser(description='Parses netgen lvs')
+ parser.add_argument('--file', '-f', required=True)
+ args = parser.parse_args()
+ failures = count_LVS_failures(args.file)
+ total = failures[0]
+ if total > 0:
+ failed = True
+ print('LVS reports:')
+ print(' net count difference = ' + str(failures[5]))
+ print(' device count difference = ' + str(failures[6]))
+ print(' unmatched nets = ' + str(failures[1]))
+ print(' unmatched devices = ' + str(failures[2]))
+ print(' unmatched pins = ' + str(failures[3]))
+ print(' property failures = ' + str(failures[4]))
+ else:
+ print('LVS reports no net, device, pin, or property mismatches.')
+
+ print('')
+ print('Total errors = ' + str(total))
+
diff --git a/scripts/fastroute.tcl b/scripts/fastroute.tcl
index 7e3d8fe..4d3c4b6 100644
--- a/scripts/fastroute.tcl
+++ b/scripts/fastroute.tcl
@@ -6,6 +6,10 @@
set_max_layer ${GLB_RT_MAXLAYER}
set_layer_adjustment 1 ${GLB_RT_LI1_ADJUSTMENT}
set_layer_adjustment 2 ${GLB_RT_MET1_ADJUSTMENT}
+set_unidirectional_routing false
+set_pitches_in_tile 10
+
+
start_fastroute
run_fastroute
write_guides
diff --git a/scripts/magic_drc_batch.tcl b/scripts/magic_drc_batch.tcl
new file mode 100644
index 0000000..ca00086
--- /dev/null
+++ b/scripts/magic_drc_batch.tcl
@@ -0,0 +1,60 @@
+if { [info exists ::env(TECH)] } {
+ tech load $::env(TECH)
+}
+
+gds read $::env(GDS_INPUT)
+proc custom_drc_save_report {{cellname ""} {outfile ""}} {
+
+ if {$outfile == ""} {set outfile "drc.out"}
+
+ set fout [open $outfile w]
+ set oscale [cif scale out]
+
+ # magic::suspendall
+
+ if {$cellname == ""} {
+ select top cell
+ set cellname [cellname list self]
+ set origname ""
+ } else {
+ set origname [cellname list self]
+ puts stdout "loading $cellname\n"
+ flush stdout
+
+ load $cellname
+ select top cell
+ }
+
+ drc check
+ set count [drc list count]
+
+ puts $fout "$cellname count: $count"
+ puts $fout "----------------------------------------"
+ set drcresult [drc listall why]
+ foreach {errtype coordlist} $drcresult {
+ puts $fout $errtype
+ puts $fout "----------------------------------------"
+ foreach coord $coordlist {
+ set bllx [expr {$oscale * [lindex $coord 0]}]
+ set blly [expr {$oscale * [lindex $coord 1]}]
+ set burx [expr {$oscale * [lindex $coord 2]}]
+ set bury [expr {$oscale * [lindex $coord 3]}]
+ set coords [format " %.3f %.3f %.3f %.3f" $bllx $blly $burx $bury]
+ puts $fout "$coords"
+ }
+ puts $fout "----------------------------------------"
+ }
+ puts $fout ""
+
+ if {$origname != ""} {
+ load $origname
+ }
+
+ # magic::resumeall
+
+ close $fout
+ puts "done with $outfile\n"
+ #flush stdout
+}
+
+custom_drc_save_report $::env(DESIGN_NAME) $::env(REPORT_OUTPUT)
diff --git a/scripts/tcl_commands/all.tcl b/scripts/tcl_commands/all.tcl
index dff8f5f..f4de39b 100644
--- a/scripts/tcl_commands/all.tcl
+++ b/scripts/tcl_commands/all.tcl
@@ -127,6 +127,7 @@
{tritonRoute routing/tritonRoute}
{magic magic/magic}
{cts cts/cts}
+ {lvs lvs/lvs}
}
set final_output \
@@ -137,6 +138,7 @@
[list tritonRoute routing/$::env(DESIGN_NAME).routing] \
[list cts cts/$::env(DESIGN_NAME).cts] \
[list magic magic/$::env(DESIGN_NAME).magic] \
+ [list lvs lvs/$::env(DESIGN_NAME).lvs] \
]
array set results_file_name [make_array $final_output $::env(RESULTS_DIR)]
@@ -158,11 +160,11 @@
}
- try_catch mkdir -p $::env(RESULTS_DIR) $::env(TMP_DIR) $::env(LOG_DIR) $::env(REPORTS_DIR)
+ exec mkdir -p $::env(RESULTS_DIR) $::env(TMP_DIR) $::env(LOG_DIR) $::env(REPORTS_DIR)
- set stages {synthesis floorplan placement cts routing magic}
+ set stages {synthesis floorplan placement cts routing magic lvs}
foreach stage $stages {
- try_catch mkdir -p $::env(RESULTS_DIR)/$stage \
+ exec mkdir -p $::env(RESULTS_DIR)/$stage \
$::env(TMP_DIR)/$stage \
$::env(LOG_DIR)/$stage \
$::env(REPORTS_DIR)/$stage
@@ -237,7 +239,6 @@
set_log ::env(LIB_MAX) $::env(LIB_MAX) $::env(GLB_CFG_FILE) 1
set_log ::env(LIB_TYPICAL) $::env(LIB_TYPICAL) $::env(GLB_CFG_FILE) 1
if { $::env(SYNTH_TOP_LEVEL) } {
-
set_log ::env(SYNTH_SCRIPT) "$::env(OPENLANE_ROOT)/scripts/synth_top.tcl" $::env(GLB_CFG_FILE) 0
} else {
set_log ::env(SYNTH_SCRIPT) "$::env(OPENLANE_ROOT)/scripts/synth.tcl" $::env(GLB_CFG_FILE) 0
@@ -248,7 +249,7 @@
# Floorplan
exec echo "# Floorplan config" >> $::env(GLB_CFG_FILE)
- set_log ::env(FP_SIZING) "relative" $::env(GLB_CFG_FILE) 0; # absolute, relative
+ set_log ::env(FP_SIZING) $::env(FP_SIZING) $::env(GLB_CFG_FILE) 0; # absolute, relative
set_log ::env(FP_CORE_UTIL) $util $::env(GLB_CFG_FILE) 1
set_log ::env(FP_ASPECT_RATIO) $::env(FP_ASPECT_RATIO) $::env(GLB_CFG_FILE) 1
set_log ::env(FP_CORE_MARGIN) $::env(FP_CORE_MARGIN) $::env(GLB_CFG_FILE) 1
diff --git a/scripts/tcl_commands/lvs.tcl b/scripts/tcl_commands/lvs.tcl
new file mode 100644
index 0000000..a2165a8
--- /dev/null
+++ b/scripts/tcl_commands/lvs.tcl
@@ -0,0 +1,42 @@
+proc verilog_to_verilogPower {args} {
+ set options {{-input required} \
+ {-output required} \
+ {-lef required} \
+ {-power required} \
+ {-ground required}}
+ set flags {}
+ parse_key_args "verilog_to_verilogPower" args arg_values $options flags_map $flags
+ set bin vlog2Verilog
+ set in $arg_values(-input)
+ set out $arg_values(-output)
+ set power $arg_values(-power)
+ set gnd $arg_values(-ground)
+ set lef $arg_values(-lef)
+
+ try_catch $bin \
+ -v $power \
+ -g $gnd \
+ -l $lef \
+ $in |& tee $out
+}
+proc run_netgen {args} {
+ set ::env(NETGEN_SETUP_FILE) $::env(PDK_ROOT)/$::env(PDK)/libs.tech/netgen/$::env(PDK)_tech.lef ; # this should be definied in the pdk it's a tmp placeholder
+ set spice_in $::env(magic_result_file_tag).spice
+ set module_name $::env(DESIGN_NAME)
+ set verilog_in $::env(lvs_result_file_tag).v
+ set setup_file $::env(NETGEN_SETUP_FILE)
+ set output $::env(lvs_result_file_tag).log
+ verilog_to_verilogPower -input $::env(yosys_result_file_tag).v -output $verilog_in -lef $::env(MERGED_LEF) \
+ -power $::env(VDD_PIN) -ground $::env(GND_PIN)
+ exec netgen -batch lvs \
+ "$spice_in $module_name" \
+ "$verilog_in $module_name" \
+ $setup_file \
+ $output \
+ -json |& tee $::env(TERMINAL_OUTPUT) $::env(lvs_log_file_tag).log
+ exec python3 $::env(SCRIPTS_DIR)/count_lvs.py -f $::env(lvs_result_file_tag).json \
+ |& tee $::env(TERMINAL_OUTPUT) $::env(lvs_result_file_tag)_parsed.log
+
+}
+
+package provide openlane 0.9
diff --git a/scripts/tcl_commands/magic.tcl b/scripts/tcl_commands/magic.tcl
new file mode 100644
index 0000000..24aa0f3
--- /dev/null
+++ b/scripts/tcl_commands/magic.tcl
@@ -0,0 +1,29 @@
+proc run_magic_spice_export {args} {
+ set magic_export $::env(TMP_DIR)/magic_spice.tcl
+set commands \
+"
+def read $::env(CURRENT_DEF)
+cd $::env(RESULTS_DIR)/magic/
+select top cell
+extract cell $::env(DESIGN_NAME)
+ext2spice lvs
+ext2spice
+exec cp $::env(DESIGN_NAME).spice $::env(magic_result_file_tag).spice
+"
+ set magic_export_file [open $magic_export w]
+ puts $magic_export_file $commands
+ close $magic_export_file
+ set magicrc $::env(TMP_DIR)/magic.magicrc
+ set ::env(PDKPATH) "$::env(PDK_ROOT)/$::env(PDK)/"
+ set ::env(MAGPATH) "$::env(PDKPATH)/libs.ref/maglef"
+ exec envsubst < $::env(SCRIPTS_DIR)/tmp.magicrc > $magicrc
+ exec magic \
+ -noconsole \
+ -dnull \
+ -rcfile $magicrc \
+ $magic_export \
+ </dev/null \
+ |& tee $::env(TERMINAL_OUTPUT) $::env(magic_log_file_tag)_spice.log
+
+}
+package provide openlane 0.9
diff --git a/scripts/tcl_commands/pkgIndex.tcl b/scripts/tcl_commands/pkgIndex.tcl
index 4221bdd..d3653db 100755
--- a/scripts/tcl_commands/pkgIndex.tcl
+++ b/scripts/tcl_commands/pkgIndex.tcl
@@ -8,4 +8,4 @@
# script is sourced, the variable $dir must contain the
# full path name of this file's directory.
-package ifneeded openlane 0.9 [list source [file join $dir all.tcl]]\n[list source [file join $dir placement.tcl]]\n[list source [file join $dir init_design.tcl]]\n[list source [file join $dir floorplan.tcl]]\n[list source [file join $dir routing.tcl]]\n[list source [file join $dir cts.tcl]]\n[list source [file join $dir synthesis.tcl]]
+package ifneeded openlane 0.9 [list source [file join $dir lvs.tcl]]\n [file join $dir magic.tcl]]\n[file join $dir all.tcl]]\n[list source [file join $dir placement.tcl]]\n[list source [file join $dir init_design.tcl]]\n[list source [file join $dir floorplan.tcl]]\n[list source [file join $dir routing.tcl]]\n[list source [file join $dir cts.tcl]]\n[list source [file join $dir synthesis.tcl]]
diff --git a/scripts/utils/utils.tcl b/scripts/utils/utils.tcl
index bf61b09..6e169fe 100644
--- a/scripts/utils/utils.tcl
+++ b/scripts/utils/utils.tcl
@@ -82,7 +82,11 @@
# a minimal try catch block
proc try_catch {args} {
- puts "Executing \"$args\"\n"
+ set cmd_log_file [open $::env(RUN_DIR)/cmds.log a+]
+ set timestamp [clock format [clock seconds]]
+ puts $cmd_log_file "$timestamp - Executing \"$args\"\n"
+ close $cmd_log_file
+
if { [catch {eval exec $args} error_msg] } {
set tool [string range $args 0 [string first " " $args]]
set print_error_msg "\[ERROR\]: during executing: \"$args\"\n"
diff --git a/succeed.tcl b/succeed.tcl
new file mode 100644
index 0000000..1504a69
--- /dev/null
+++ b/succeed.tcl
@@ -0,0 +1,3 @@
+verilog2def -verilog /home/ahmedg/openlane_dev/designs/spm/runs/abs_fp/results/synthesis/spm.synthesis.v -lef /home/ahmedg/openlane_dev/designs/spm/runs/abs_fp/tmp//merged.lef -liberty /home/ahmedg/openlane_dev/designs/spm/runs/abs_fp/tmp//trimmed.lib -top_module spm -site unitehd -tracks /home/ahmedg/openlane_dev/pdks//ef-skywater-s8/EFS8A//libs.tech/openlane/common_tracks.info -units 1000 -utilization 50 -aspect_ratio 1 -core_space 3.36 -def /home/ahmedg/openlane_dev/designs/spm/runs/abs_fp/tmp/floorplan/verilog2def_broken.def -verbose
+
+