Merge branch 'develop' into develop_openroadapp
diff --git a/docker_build/docker/magic/Dockerfile b/docker_build/docker/magic/Dockerfile
index 26c11ff..51e470b 100644
--- a/docker_build/docker/magic/Dockerfile
+++ b/docker_build/docker/magic/Dockerfile
@@ -3,6 +3,15 @@
 
 # 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
+#
 
 # magic dependencies
 RUN yum install -y csh wget tcl-devel tk-devel libX11-devel cairo-devel ncurses-devel
@@ -13,7 +22,7 @@
 
 WORKDIR "magic"
 
-RUN git checkout magic-8.2
+RUN git checkout bebd603296d4afa4ff413669cef3b058e9fccf39
 
 # build
 RUN ./configure --prefix=/build && \
diff --git a/docker_build/tar/magic.tar.gz b/docker_build/tar/magic.tar.gz
index ea2fd0e..7989082 100644
--- a/docker_build/tar/magic.tar.gz
+++ b/docker_build/tar/magic.tar.gz
Binary files differ
diff --git a/pdks/ef-skywater-s8 b/pdks/ef-skywater-s8
index fa4034e..64a70e1 160000
--- a/pdks/ef-skywater-s8
+++ b/pdks/ef-skywater-s8
@@ -1 +1 @@
-Subproject commit fa4034ee98ba25ccca37f7116f1df5d175989864
+Subproject commit 64a70e15700965676a29e5e942f83078bbcb232a
diff --git a/scripts/magic.tcl b/scripts/magic.tcl
index 5cba479..0d77693 100644
--- a/scripts/magic.tcl
+++ b/scripts/magic.tcl
@@ -1,35 +1,13 @@
-scalegrid 1 2
-box 0 0 0 0
-drc off
-snap int
-
-# Read tech lef
-#addpath ./platforms/$::env(PLATFORM)
-#load libcell_scs8lp; # ?
-lef read $::env(MERGED_LEF)
-
-
-# Read gds files
-gds readonly true
-gds rescale false
-foreach gdsFile $::env(GDS_FILES) {
-  gds read $gdsFile
-}
-
 
 # Read def and load design
 def read $::env(CURRENT_DEF)
-load $::env(DESIGN_NAME)
+# load $::env(DESIGN_NAME)
 
 # Write gds
-select top cell
-expand
 gds write $::env(magic_result_file_tag).gds
 
 puts "GDS write complete"
 
 lef write $::env(magic_result_file_tag).lef -hide
 lef write $::env(magic_result_file_tag).full.lef 
-quit -noprompt
-exit
 
diff --git a/scripts/padframe2fp.py b/scripts/padframe2fp.py
index 9906c6f..2ef029e 100644
--- a/scripts/padframe2fp.py
+++ b/scripts/padframe2fp.py
@@ -7,6 +7,7 @@
 PINS_REGEX = r'PIN\s+(\S+).*PORT\s+(.*;\s+)END.*END\s+\1\n'
 PLACED_COMP_REGEX = r"^\s*-\s+([^\s]+)\s+([^\s]+)\s+\+\s+PLACED\s+\(\s(-?\d+)\s(-?\d+)\s\)\s+([NEWS])\s+;$"
 PIN_IGNORE = ['VSS', 'VDD', 'PAD', 'in3v', 'vdd']
+NETS_IGNORE = ['vdd', 'vss']
 NETSECTION_REGEX = r"^NETS\s+\S+\s+;\s+(.*)END NETS\s+"
 # \s+([NEWS])\s+;$"
 def getMacroPins(content, macro_name):
@@ -51,8 +52,13 @@
     nets = filter(None, nets_section[0].replace('\n', ' ').split("- "))
     nets_dict = {}
     for net in nets:
-        connection = re.findall(r"\s*(\S+)\s+\(\s+(.*)\s+\)\s+\(\s+(.*)\s+\)\s+;", net)[0]
-        nets_dict[connection[0]] = connection[1:]
+        net_name = re.findall(r"\s*(\S+).*;",net)
+        if any(net_name[0].find(net_ignore) != -1 for net_ignore in NETS_IGNORE):
+            continue
+        connections = re.findall(r"\(\s+(.*?)\s+\)",net)
+        connections = [connection.replace('\\','') for connection in connections]
+        nets_dict[net_name[0]] = connections
+        #print(net_name, connections)
 
     return nets_dict
 
@@ -104,7 +110,6 @@
     for pin in macro_data["pins"]:
         if any(pin.find(pin_ignore) != -1 for pin_ignore in PIN_IGNORE):
             continue
-        pin_cnt += 1
         pin_data = macro_data["pins"][pin]
         # print(pin_data)
         #pin_tag = comp+"."+comp_data["macro"]+'.'+pin
@@ -115,7 +120,9 @@
                 pin_tag = net
                 found = True
                 break
-        if not found: continue
+        if not found:
+            continue
+        pin_cnt += 1
         pin_section += "- %s + NET %s\n+ PLACED ( %d %d ) %s" % \
         (pin_tag, pin_tag, pos_x, pos_y, orientation)
         for layer in pin_data:
diff --git a/scripts/run_magic.tcl b/scripts/run_magic.tcl
index 69beb0f..b125f13 100644
--- a/scripts/run_magic.tcl
+++ b/scripts/run_magic.tcl
@@ -1,8 +1,13 @@
+set magicrc $::env(TMP_DIR)/magic.magicrc
+set ::env(PDKPATH) "$::env(PDK_ROOT)/ef-skywater-s8/EFS8A"
+set ::env(MAGPATH) "$::env(PDKPATH)/libs.ref/maglef"
+exec envsubst < $::env(SCRIPTS_DIR)/tmp.magicrc > $magicrc
 exec magic \
         -noconsole \
         -dnull \
-        -norcfile \
-        -T $::env(MAGIC_TECH_FILE) \
+        -rcfile $magicrc \
         $::env(SCRIPTS_DIR)/magic.tcl \
 	</dev/null \
         |& tee $::env(TERMINAL_OUTPUT) $::env(magic_log_file_tag).log
+
+
diff --git a/scripts/tcl_commands/all.tcl b/scripts/tcl_commands/all.tcl
index cc0fc3b..7083236 100644
--- a/scripts/tcl_commands/all.tcl
+++ b/scripts/tcl_commands/all.tcl
@@ -346,6 +346,11 @@
 		puts "Streaming out GDS II..."
 		set ::env(CURRENT_STAGE) finishing
 		if {[catch {exec tclsh $::env(SCRIPTS_DIR)/run_magic.tcl} issue]} { }
+#		set PDKPATH $::env(PDK_ROOT)/$::env(PDK)/ 
+#		set tech $PDKPATH/libs.tech/magic/current/EFS8A.tech
+#		cd $::env(TMP_DIR)
+#		exec /ef/apps/bin/magicGdrc -T $tech $::env(magic_result_file_tag).gds $::env(DESIGN_NAME) \
+			|& tee $::env(TERMINAL_OUTPUT) $::env(magic_log_file_tag).drc
 	}
 }
 
diff --git a/scripts/tcl_commands/placement.tcl b/scripts/tcl_commands/placement.tcl
index 46b7fd5..ba9f5b5 100644
--- a/scripts/tcl_commands/placement.tcl
+++ b/scripts/tcl_commands/placement.tcl
@@ -41,6 +41,10 @@
 	try_catch openroad -exit $::env(SCRIPTS_DIR)/openroad/or_opendp.tcl |& tee $::env(TERMINAL_OUTPUT) $::env(opendp_log_file_tag)_openroad.log
 	TIMER::timer_stop
 	exec echo "[TIMER::get_runtime]" >> $::env(opendp_log_file_tag)_runtime.txt
+	if {![catch {eval exec grep -q "FAIL" $::env(opendp_log_file_tag).log}]}  {
+		puts "Error: Check $::env(opendp_log_file_tag).log"
+		exit 1
+	}
 	set_def $::env(SAVE_DEF)
 }
 
diff --git a/scripts/tmp.magicrc b/scripts/tmp.magicrc
new file mode 100644
index 0000000..323515c
--- /dev/null
+++ b/scripts/tmp.magicrc
@@ -0,0 +1,53 @@
+puts stdout "Sourcing design .magicrc for technology EFS8A ..."
+
+# Put grid on 0.005 pitch.  This is important, as some commands don't
+# rescale the grid automatically (such as lef read?).
+
+#set scalefac [tech lambda]
+if {[lindex [tech lambda] 1] < 2} {
+    scalegrid 1 2
+}
+
+drc off
+# drc euclidean on
+
+#set PDKPATH "${PDK_ROOT}/pdks/ef-skywater-s8/EFS8A"
+
+# loading technology
+tech load $PDKPATH/libs.tech/magic/current/EFS8A.tech
+
+
+# load techlef ?
+lef read ${TECH_LEF}
+
+# load device generator
+source $PDKPATH/libs.tech/magic/current/EFS8A.tcl
+
+# load bind keys (optional)
+source $PDKPATH/libs.tech/magic/current/EFS8A-BindKeys
+
+# set units to lambda grid 
+snap lambda
+
+# add path to reference cells
+#set MAGPATH "${PDKPATH}/libs.ref/maglef"
+addpath ${MAGPATH}/primdev
+addpath ${MAGPATH}/s8_osu130
+addpath ${MAGPATH}/efs8hd
+addpath ${MAGPATH}/efs8_pads
+#addpath ${MAGPATH}/s8fmlt
+#addpath ${MAGPATH}/s8iom0
+#addpath ${MAGPATH}/scs8hd
+#addpath ${MAGPATH}/scs8hdll
+#addpath ${MAGPATH}/scs8hvl
+#addpath ${MAGPATH}/scs8hs
+#addpath ${MAGPATH}/scs8ms
+#addpath ${MAGPATH}/scs8ls
+#addpath ${MAGPATH}/scs8lp
+
+# add path to GDS cells
+
+# add path to IP from catalog.  This procedure defined in the PDK script.
+catch {magic::query_mylib_ip}
+# add path to local IP from user design space.  Defined in the PDK script.
+catch {magic::query_my_projects}