summaryrefslogtreecommitdiff
path: root/scripts/replace.sh
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/replace.sh')
-rwxr-xr-xscripts/replace.sh747
1 files changed, 747 insertions, 0 deletions
diff --git a/scripts/replace.sh b/scripts/replace.sh
new file mode 100755
index 0000000..6e7c47e
--- /dev/null
+++ b/scripts/replace.sh
@@ -0,0 +1,747 @@
+#!/usr/bin/tcsh -f
+#----------------------------------------------------------
+# Placement script using abk-openroad RePlAce
+#
+#----------------------------------------------------------
+# Tim Edwards, 12/26/18, for Open Circuit Design
+#----------------------------------------------------------
+
+if ($#argv < 2) then
+ echo Usage: replace.sh <project_path> <source_name>
+ exit 1
+endif
+
+# Split out options from the main arguments
+set argline=(`getopt "kdf" $argv[1-]`)
+set cmdargs=`echo "$argline" | awk 'BEGIN {FS = "-- "} END {print $2}'`
+set argc=`echo $cmdargs | wc -w`
+
+if ($argc == 2) then
+ set argv1=`echo $cmdargs | cut -d' ' -f1`
+ set argv2=`echo $cmdargs | cut -d' ' -f2`
+else
+ echo Usage: replace.sh [options] <project_path> <source_name>
+ echo where
+ echo <project_path> is the name of the project directory containing
+ echo a file called qflow_vars.sh.
+ echo <source_name> is the root name of the verilog file, and
+ echo [options] are:
+ echo -k keep working files
+ echo -d generate DEF file for routing
+ echo -f final placement. Don't run if routing succeeded
+ echo
+ echo Options to specific tools can be specified with the following
+ echo variables in project_vars.sh:
+ echo
+ echo
+ exit 1
+endif
+
+set keep=0
+set makedef=0
+set final = 0
+
+foreach option (${argline})
+ switch (${option})
+ case -k:
+ set keep=1
+ breaksw
+ case -d:
+ set makedef=1
+ breaksw
+ case -f:
+ set final=1
+ breaksw
+ case --:
+ break
+ endsw
+end
+
+set projectpath=$argv1
+set sourcename=$argv2
+set rootname=${sourcename:h}
+
+# This script is called with the first argument <project_path>, which should
+# have file "qflow_vars.sh". Get all of our standard variable definitions
+# from the qflow_vars.sh file.
+
+if (! -f ${projectpath}/qflow_vars.sh ) then
+ echo "Error: Cannot find file qflow_vars.sh in path ${projectpath}"
+ exit 1
+endif
+
+source ${projectpath}/qflow_vars.sh
+source ${techdir}/${techname}.sh
+cd ${projectpath}
+if (-f project_vars.sh) then
+ source project_vars.sh
+endif
+
+# Get power and ground bus names
+if (-f ${synthdir}/${rootname}_powerground) then
+ source ${synthdir}/${rootname}_powerground
+endif
+
+# Prepend techdir to each leffile unless leffile begins with "/"
+set lefpath=""
+foreach f (${leffile})
+ set abspath=`echo ${f} | cut -c1`
+ if ( "${abspath}" == "/" ) then
+ set p=${leffile}
+ else
+ set p=${techdir}/${leffile}
+ endif
+ set lefpath="${lefpath} $p"
+end
+
+# Prepend techdir to techleffile unless techleffile begins with "/"
+set abspath=`echo ${techleffile} | cut -c1`
+if ( "${abspath}" == "/" ) then
+ set techlefpath=${techleffile}
+else
+ set techlefpath=${techdir}/${techleffile}
+endif
+
+# Prepend techdir to each spicefile unless spicefile begins with "/"
+set spicepath=""
+foreach f (${spicefile})
+ set abspath=`echo ${f} | cut -c1`
+ if ( "${abspath}" == "/" ) then
+ set p=${spicefile}
+ else
+ set p=${techdir}/${spicefile}
+ endif
+ set spicepath="${spicepath} $p"
+end
+
+# Add hard macros to spice path
+
+if ( ${?hard_macros} ) then
+ foreach macro_path ( $hard_macros )
+ foreach file ( `ls ${sourcedir}/${macro_path}` )
+ # Too bad SPICE doesn't have an agreed-upon extension. Common ones are:
+ if ( ${file:e} == "sp" || ${file:e} == "spc" || \
+ ${file:e} == "spice" || ${file:e} == "cdl" || \
+ ${file:e} == "ckt" || ${file:e} == "net") then
+ set spicepath="${spicepath} -l ${sourcedir}/${macro_path}/${file}"
+ break
+ endif
+ end
+ end
+endif
+
+if (! ${?qrouter_nocleanup} ) then
+ set qrouter_nocleanup = ""
+else
+ if (${qrouter_nocleanup} == 0) then
+ set qrouter_nocleanup = ""
+ else
+ set qrouter_nocleanup = "true"
+ endif
+endif
+
+if (!($?logdir)) then
+ set logdir=${projectpath}/log
+endif
+mkdir -p ${logdir}
+set lastlog=${logdir}/synth.log
+set synthlog=${logdir}/place.log
+rm -f ${synthlog} >& /dev/null
+rm -f ${logdir}/sta.log >& /dev/null
+rm -f ${logdir}/route.log >& /dev/null
+rm -f ${logdir}/post_sta.log >& /dev/null
+rm -f ${logdir}/migrate.log >& /dev/null
+rm -f ${logdir}/drc.log >& /dev/null
+rm -f ${logdir}/lvs.log >& /dev/null
+rm -f ${logdir}/gdsii.log >& /dev/null
+touch ${synthlog}
+set date=`date`
+echo "Qflow placement logfile created on $date" > ${synthlog}
+
+#----------------------------------------------------------
+# Done with initialization
+#----------------------------------------------------------
+
+# Check if last line of log file says "error condition"
+set errcond = `tail -1 ${lastlog} | grep "error condition" | wc -l`
+if ( ${errcond} == 1 ) then
+ echo "Synthesis flow stopped on error condition. Placement will not proceed"
+ echo "until error condition is cleared."
+ exit 1
+endif
+
+#---------------------------------------------------
+# Create .info file from qrouter
+#---------------------------------------------------
+
+cd ${layoutdir}
+
+# First prepare a simple .cfg file that can be used to point qrouter
+# to the LEF files when generating layer information using the "-i" option.
+# This also contains the scaling units used in the .cel and .def files.
+
+#------------------------------------------------------------------
+# Determine the version number and availability of scripting
+# in qrouter.
+#------------------------------------------------------------------
+
+set version=`${bindir}/qrouter -v 0 -h | tail -1`
+set major=`echo $version | cut -d. -f1`
+set minor=`echo $version | cut -d. -f2`
+set subv=`echo $version | cut -d. -f3`
+set scripting=`echo $version | cut -d. -f4`
+
+# Create the initial (bootstrap) configuration file
+
+if ( $scripting == "T" ) then
+ if ( "$techleffile" == "" ) then
+ echo "read_lef ${lefpath}" > ${rootname}.cfg
+ else
+ echo "read_lef ${techlefpath}" > ${rootname}.cfg
+ endif
+else
+ if ( "$techleffile" == "" ) then
+ echo "lef ${lefpath}" > ${rootname}.cfg
+ else
+ echo "lef ${techlefpath}" > ${rootname}.cfg
+ endif
+endif
+
+${bindir}/qrouter -i ${rootname}.info -c ${rootname}.cfg
+
+#---------------------------------------------------------------------
+# Spot check: Did qrouter produce file ${rootname}.info?
+#---------------------------------------------------------------------
+
+if ( ! -f ${rootname}.info || \
+ ( -M ${rootname}.info < -M ${rootname}.pin )) then
+ echo "qrouter (-i) failure: No file ${rootname}.info." |& tee -a ${synthlog}
+ echo "Premature exit." |& tee -a ${synthlog}
+ echo "Synthesis flow stopped due to error condition." >> ${synthlog}
+ exit 1
+endif
+
+# Pull scale units from the .info file. Default units are centimicrons.
+set units=`cat ${rootname}.info | grep units | cut -d' ' -f3`
+if ( "${units}" == "" ) then
+ set units=100
+endif
+
+#-------------------------------------------------------------------------
+# Create the pre-placement .def file for RePlAce
+#-------------------------------------------------------------------------
+
+cd ${projectpath}
+
+if ( "$techleffile" == "" ) then
+ set lefoptions=""
+ set reploptions=""
+else
+ set lefoptions="-l ${techlefpath}"
+ set reploptions="-lef ${techlefpath}"
+endif
+set lefoptions="${lefoptions} -l ${lefpath}"
+set reploptions="${reploptions} -lef ${lefpath}"
+
+# Pass additional .lef files to vlog2Def and DEF2Verilog from the hard macros list
+
+if ( ${?hard_macros} ) then
+ foreach macro_path ( $hard_macros )
+ foreach file ( `ls ${sourcedir}/${macro_path}` )
+ if ( ${file:e} == "lef" ) then
+ set lefoptions="${lefoptions} -l ${sourcedir}/${macro_path}/${file}"
+ endif
+ end
+ end
+endif
+
+if ( ${?initial_density} ) then
+ set vlog2defopts = "-d ${initial_density}"
+else
+ set vlog2defopts = ""
+endif
+
+echo "Running vlog2Def to generate input files for graywolf" |& tee -a ${synthlog}
+echo "vlog2Def ${lefoptions} -u $units ${vlog2defopts} -o ${layoutdir}/${rootname}_preplace.def ${synthdir}/${rootname}.rtlnopwr.v" |& tee -a ${synthlog}
+
+${bindir}/vlog2Def ${lefoptions} -u $units ${vlog2defopts} -o ${layoutdir}/${rootname}_preplace.def \
+ ${synthdir}/${rootname}.rtlnopwr.v >>& ${synthlog}
+
+set errcond = $status
+if ( ${errcond} != 0 ) then
+ echo "vlog2Def failed with exit status ${errcond}" |& tee -a ${synthlog}
+ echo "Premature exit." |& tee -a ${synthlog}
+ echo "Synthesis flow stopped on error condition." >>& ${synthlog}
+ exit 1
+endif
+
+#---------------------------------------------------------------------
+# Spot check: Did vlog2Def produce file ${rootname}_preplace.def?
+#---------------------------------------------------------------------
+
+if ( ! -f ${layoutdir}/${rootname}_preplace.def || \
+ ( -M ${layoutdir}/${rootname}_preplace.def \
+ < -M ${rootname}.rtlnopwr.v )) then
+ echo "vlog2Def failure: No file ${rootname}_preplace.def." |& tee -a ${synthlog}
+ echo "vlog2Def was called with arguments: ${lefpath} "
+ echo " -u $units -o ${layoutdir}/${rootname}_preplace.def"
+ echo " ${synthdir}/${rootname}.rtlnopwr.v"
+ echo "Premature exit." |& tee -a ${synthlog}
+ echo "Synthesis flow stopped due to error condition." >> ${synthlog}
+ exit 1
+endif
+
+#---------------------------------------------------------------------
+# Move to the layout directory
+#---------------------------------------------------------------------
+
+cd ${layoutdir}
+
+#---------------------------------------------------------------------
+# To do: Add behavior to manually define blockages.
+#---------------------------------------------------------------------
+
+# Set value ${fillers} to be equal either to a single cell name if
+# only one of (decapcell, antennacell, fillcell, bodytiecell) is
+# defined, or a comma-separated quadruplet. If only one is defined,
+# then "fillcell" is set to that name for those scripts that only
+# handle one kind of fill cell.
+
+# Make sure all cell types are defined, but an empty string if not used.
+
+if ( ! ${?fillcell} ) then
+ set fillcell = ""
+endif
+if ( ! ${?decapcell} ) then
+ set decapcell = ""
+endif
+if ( ! ${?antennacell} ) then
+ set antennacell = ""
+endif
+if ( ! ${?bodytiecell} ) then
+ set bodytiecell = ""
+endif
+
+set fillers = "${fillcell},${decapcell},${antennacell},${bodytiecell}"
+
+# For tools that only require one fill cell as option, make sure that
+# there is a valid fill cell type
+if ("x$fillcell" == "x") then
+ set fillcell = $decapcell
+endif
+if ("x$fillcell" == "x") then
+ set fillcell = $antennacell
+endif
+if ("x$fillcell" == "x") then
+ set fillcell = $bodytiecell
+endif
+if ("x$fillcell" == "x") then
+ # There is no fill cell, which is likely to produce poor results.
+ echo "Warning: No fill cell types are defined in the tech setup script."
+ echo "This is likely to produce poor layout and/or poor routing results."
+endif
+
+#---------------------------------------------------------------------
+# To do: Define a way to pass pin placement hints to RePlAce
+#---------------------------------------------------------------------
+
+#-----------------------------------------------
+# 1) Run RePlAce
+#-----------------------------------------------
+
+if ( !( ${?replace_options} )) then
+ # Some defaults (to be refined)
+ set replace_options = "-bmflag ispd"
+ set replace_options = "${replace_options} ${reploptions}"
+ set replace_options = "${replace_options} -def ${layoutdir}/${rootname}_preplace.def"
+ set replace_options = "${replace_options} -output outputs"
+ set replace_options = "${replace_options} -dpflag NTU3"
+ set replace_options = "${replace_options} -dploc ${bindir}/ntuplace3"
+endif
+
+#----------------------------------------------------------------------------
+# Set -den option to RePlAce if initial_density is defined in project_vars.sh
+
+if ( ${?initial_density} ) then
+ set replace_options = "${replace_options} -den ${initial_density}"
+endif
+
+echo "Running RePlAce placement" |& tee -a ${synthlog}
+echo "RePlAce ${replace_options}" |& tee -a ${synthlog}
+${bindir}/RePlAce ${replace_options} >>& ${synthlog}
+
+set errcond = $status
+if ( ${errcond} != 0 ) then
+ echo "RePlAce failed with exit status ${errcond}" |& tee -a ${synthlog}
+ echo "Premature exit." |& tee -a ${synthlog}
+ echo "Synthesis flow stopped on error condition." >>& ${synthlog}
+ exit 1
+endif
+
+#---------------------------------------------------------------------
+# Spot check: Did RePlAce produce file ${rootname}_preplace_final.def?
+#---------------------------------------------------------------------
+
+set outfile=`ls outputs/ispd/${rootname}_preplace/experiment*/${rootname}_preplace_final.def --sort=time | head -1`
+
+if ( ! -f ${outfile} || \
+ ( -M ${outfile} < -M ${rootname}_preplace.def )) then
+ echo "RePlAce failure: No file ${rootname}_preplace_final.def." |& tee -a ${synthlog}
+ echo "Premature exit." |& tee -a ${synthlog}
+ echo "Synthesis flow stopped due to error condition." >> ${synthlog}
+ exit 1
+endif
+
+echo "Copying RePlAce result up to layout directory:" |& tee -a ${synthlog}
+echo "cp ${outfile} ${rootname}.def" |& tee -a ${synthlog}
+cp ${outfile} ${rootname}.def
+
+#---------------------------------------------------
+# Remove RePlAce working files
+#---------------------------------------------------
+
+if ($keep == 0) then
+ rm -rf outputs
+endif
+
+#---------------------------------------------------------------
+# 2) Run clock tree synthesis and back-annotate netlists
+#---------------------------------------------------------------
+
+#---------------------------------------------------
+# NOTE: This should be in the qrouter script. . .
+# 3) Prepare .cfg file for qrouter
+#---------------------------------------------------
+
+if ($makedef == 1) then
+
+ echo "Running getantennacell to determine cell to use for antenna anchors." \
+ |& tee -a ${synthlog}
+ echo "getantennacell.tcl $rootname ${lefpath} $antennacell" |& tee -a ${synthlog}
+ set useantennacell=`${scriptdir}/getantennacell.tcl $rootname \
+ ${lefpath} $antennacell | grep antenna= | cut -d= -f2 | cut -d/ -f1`
+
+ if ( "${useantennacell}" != "" ) then
+ echo "Using cell ${useantennacell} for antenna anchors" |& tee -a ${synthlog}
+ endif
+
+ #---------------------------------------------------------------------
+ # Add spacer cells to create a straight border on the right side
+ # Add power stripes, stretching the cell if specified
+ #---------------------------------------------------------------------
+
+ if ( !(${?nospacers}) && (-f ${bindir}/addspacers) ) then
+
+ # Fill will use just the fillcell for padding under power buses
+ # and on the edges (to do: refine this to use other spacer types
+ # if the width options are more flexible).
+
+ if ( !( ${?addspacers_options} )) then
+ set addspacers_options = ""
+ endif
+ set addspacers_options = "${addspacers_options} -p ${vddnet} -g ${gndnet} -f ${fillcell} -O"
+
+ echo "Running addspacers to generate power stripes and align cell right edge" \
+ |& tee -a ${synthlog}
+ echo "addspacers ${addspacers_options} ${lefoptions} -o ${rootname}_filled.def ${rootname}" \
+ |& tee -a ${synthlog}
+
+ rm -f ${rootname}_filled.def
+ ${bindir}/addspacers ${addspacers_options} ${lefoptions} \
+ -o ${rootname}_filled.def ${rootname} >>& ${synthlog}
+ set errcond = $status
+ if ( ${errcond} != 0 ) then
+ echo "addspacers failed with exit status ${errcond}" |& tee -a ${synthlog}
+ echo "Premature exit." |& tee -a ${synthlog}
+ echo "Synthesis flow stopped on error condition." >>& ${synthlog}
+ exit 1
+ endif
+
+ if ( -f ${rootname}_filled.def ) then
+ mv ${rootname}_filled.def ${rootname}.def
+ endif
+
+ if ( -f ${rootname}.obsx ) then
+ # If addspacers annotated the .obs (obstruction) file, then
+ # overwrite the original.
+ mv ${rootname}.obsx ${rootname}.obs
+ endif
+ endif
+
+ # Copy the .def file to a backup called "unroute"
+ cp ${rootname}.def ${rootname}_unroute.def
+
+ # If the user didn't specify a number of layers for routing as part of
+ # the project variables, then the info file created by qrouter will have
+ # as many lines as there are route layers defined in the technology LEF
+ # file.
+
+ if ( !( ${?route_layers} )) then
+ set route_layers = `cat ${rootname}.info | grep -e horizontal -e vertical | wc -l`
+ endif
+
+ # Create the main configuration file
+
+ # Variables "via_pattern" (none, normal, invert), "via_stacks",
+ # and "via_use" can be specified in the tech script, and are
+ # appended to the qrouter configuration file. via_stacks defaults
+ # to 2 if not specified. It can be overridden from the user's .cfg2
+ # file.
+
+ if (${scripting} == "T") then
+ echo "# qrouter runtime script for project ${rootname}" > ${rootname}.cfg
+ echo "" >> ${rootname}.cfg
+ echo "verbose 1" >> ${rootname}.cfg
+ if ( "$techleffile" != "" ) then
+ echo "read_lef ${techlefpath}" >> ${rootname}.cfg
+ endif
+ echo "read_lef ${lefpath}" >> ${rootname}.cfg
+
+ if ( ${?hard_macros} ) then
+ foreach macro_path ( $hard_macros )
+ foreach file ( `ls ${sourcedir}/${macro_path}` )
+ if ( ${file:e} == "lef" ) then
+ echo "read_lef ${sourcedir}/${macro_path}/${file}" >> ${rootname}.cfg
+ endif
+ end
+ end
+ endif
+
+ echo "catch {layers ${route_layers}}" >> ${rootname}.cfg
+ if ( ${?via_use} ) then
+ echo "" >> ${rootname}.cfg
+ echo "via use ${via_use}" >> ${rootname}.cfg
+ endif
+ if ( ${?via_pattern} ) then
+ echo "" >> ${rootname}.cfg
+ echo "via pattern ${via_pattern}" >> ${rootname}.cfg
+ endif
+ if (! ${?via_stacks} ) then
+ set via_stacks="all"
+ endif
+ echo "via stack ${via_stacks}" >> ${rootname}.cfg
+ echo "vdd $vddnet" >> ${rootname}.cfg
+ echo "gnd $gndnet" >> ${rootname}.cfg
+
+ else
+ echo "# qrouter configuration for project ${rootname}" > ${rootname}.cfg
+ echo "" >> ${rootname}.cfg
+ if ( "$techleffile" != "" ) then
+ echo "lef ${techlefpath}" >> ${rootname}.cfg
+ endif
+ echo "lef ${lefpath}" >> ${rootname}.cfg
+ if ( ${?hard_macros} ) then
+ foreach macro_path ( $hard_macros )
+ foreach file ( `ls ${sourcedir}/${macro_path}` )
+ if ( ${file:e} == "lef" ) then
+ echo "lef ${sourcedir}/${macro_path}/${file}" >> ${rootname}.cfg
+ endif
+ end
+ end
+ endif
+ echo "num_layers ${route_layers}" >> ${rootname}.cfg
+ if ( ${?via_pattern} ) then
+ echo "" >> ${rootname}.cfg
+ echo "via pattern ${via_pattern}" >> ${rootname}.cfg
+ endif
+ if ( ${?via_stacks} ) then
+ if (${via_stacks} == "none") then
+ echo "no stack" >> ${rootname}.cfg
+ else
+ if (${via_stacks} == "all") then
+ echo "stack ${route_layers}" >> ${rootname}.cfg
+ else
+ echo "stack ${via_stacks}" >> ${rootname}.cfg
+ endif
+ endif
+ endif
+ endif
+
+ # Add obstruction fence around design, created by place2def.tcl
+ # and modified by addspacers
+
+ if ( -f ${rootname}.obs ) then
+ cat ${rootname}.obs >> ${rootname}.cfg
+ endif
+
+ # Scripted version continues with the read-in of the DEF file
+
+ if (${scripting} == "T") then
+ if ("x$useantennacell" != "x") then
+ echo "catch {qrouter::antenna init ${useantennacell}}" >> ${rootname}.cfg
+ endif
+ echo "read_def ${rootname}.def" >> ${rootname}.cfg
+ endif
+
+ # If there is a file called ${rootname}.cfg2, then append it to the
+ # ${rootname}.cfg file. It will be used to define all routing behavior.
+ # Otherwise, if using scripting, then append the appropriate routing
+ # command or procedure based on whether this is a pre-congestion
+ # estimate of routing or the final routing pass.
+
+ if ( -f ${rootname}.cfg2 ) then
+ cat ${rootname}.cfg2 >> ${rootname}.cfg
+ else
+ if (${scripting} == "T") then
+ echo "qrouter::standard_route ${rootname}_route.def false ${qrouter_nocleanup}" >> ${rootname}.cfg
+ # write_delays folded into standard_route in qrouter version 1.4.21.
+ if (${major} == 1 && ${minor} == 4 && ${subv} < 21) then
+ echo "qrouter::write_delays ${rootname}_route.rc" >> ${rootname}.cfg
+ endif
+ # Qrouter will drop into the interpreter on failure, so force a
+ # quit command to make sure that qrouter actually exits.
+ echo "quit" >> ${rootname}.cfg
+ endif
+ endif
+
+ #------------------------------------------------------------------
+ # Automatic optimization of buffer tree placement causes the
+ # original BLIF netlist, with tentative buffer assignments, to
+ # be invalid. Use the DEF2Verilog tool to back-annotate the
+ # correct assignments into the original BLIF netlist, then
+ # use that BLIF netlist to regenerate the SPICE and RTL verilog
+ # netlists.
+ #------------------------------------------------------------------
+
+ echo "DEF2Verilog -v ${synthdir}/${rootname}.rtlnopwr.v -o ${synthdir}/${rootname}_anno.v" \
+ |& tee -a ${synthlog}
+ echo "-p ${vddnet} -g ${gndnet} ${lefoptions} ${rootname}.def" |& tee -a ${synthlog}
+ ${bindir}/DEF2Verilog -v ${synthdir}/${rootname}.rtlnopwr.v \
+ -o ${synthdir}/${rootname}_anno.v \
+ -p ${vddnet} -g ${gndnet} \
+ ${lefoptions} ${rootname}.def >>& ${synthlog}
+ set errcond = $status
+ if ( ${errcond} != 0 ) then
+ echo "DEF2Verilog failed with exit status ${errcond}" |& tee -a ${synthlog}
+ echo "Premature exit." |& tee -a ${synthlog}
+ echo "Synthesis flow stopped on error condition." >>& ${synthlog}
+ exit 1
+ endif
+
+ #------------------------------------------------------------------
+ # Spot check: Did DEF2Verilog produce an output file?
+ #------------------------------------------------------------------
+
+ if ( !( -f ${synthdir}/${rootname}_anno.v )) then
+ echo "DEF2Verilog failure: No file ${rootname}_anno.v." \
+ |& tee -a ${synthlog}
+ echo "RTL verilog and SPICE netlists may be invalid if there" \
+ |& tee -a ${synthlog}
+ echo "were buffer trees optimized by placement." |& tee -a ${synthlog}
+ echo "Synthesis flow continuing, condition not fatal." >> ${synthlog}
+ else
+ echo "" >> ${synthlog}
+ echo "Generating RTL verilog and SPICE netlist file in directory" \
+ |& tee -a ${synthlog}
+ echo " ${synthdir}" |& tee -a ${synthlog}
+ echo "Files:" |& tee -a ${synthlog}
+ echo " Verilog: ${synthdir}/${rootname}.rtl.v" |& tee -a ${synthlog}
+ echo " Verilog: ${synthdir}/${rootname}.rtlnopwr.v" |& tee -a ${synthlog}
+ echo " Verilog: ${synthdir}/${rootname}.rtlbb.v" |& tee -a ${synthlog}
+ echo " Spice: ${synthdir}/${rootname}.spc" |& tee -a ${synthlog}
+ echo "" >> ${synthlog}
+
+ cd ${synthdir}
+
+ #------------------------------------------------------------------
+ # Copy the original rtl.v and rtlnopwr.v for use in comparison of
+ # pre- and post-placement netlists.
+ #------------------------------------------------------------------
+
+ echo "Copying ${rootname}.rtl.v, ${rootname}.rtlnopwr.v, and ${rootname}.rtlbb.v to backups"
+ cp ${rootname}.rtl.v ${rootname}_synth.rtl.v
+ cp ${rootname}.rtlnopwr.v ${rootname}_synth.rtlnopwr.v
+ cp ${rootname}.rtlbb.v ${rootname}_synth.rtlbb.v
+
+ echo "Running vlog2Verilog." |& tee -a ${synthlog}
+ echo "vlog2Verilog -c -v ${vddnet} -g ${gndnet} -o ${rootname}.rtl.v ${rootname}_anno.v" |& tee -a ${synthlog}
+ ${bindir}/vlog2Verilog -c -v ${vddnet} -g ${gndnet} \
+ -o ${rootname}.rtl.v ${rootname}_anno.v >>& ${synthlog}
+
+ set errcond = $status
+ if ( ${errcond} != 0 ) then
+ echo "vlog2Verilog failed with exit status ${errcond}" |& tee -a ${synthlog}
+ echo "Premature exit." |& tee -a ${synthlog}
+ echo "Synthesis flow stopped on error condition." >>& ${synthlog}
+ exit 1
+ endif
+
+ echo "vlog2Verilog -c -p -v ${vddnet} -g ${gndnet} -o ${rootname}.rtlnopwr.v ${rootname}_anno.v" |& tee -a ${synthlog}
+ ${bindir}/vlog2Verilog -c -p -v ${vddnet} -g ${gndnet} \
+ -o ${rootname}.rtlnopwr.v ${rootname}_anno.v >>& ${synthlog}
+
+ set errcond = $status
+ if ( ${errcond} != 0 ) then
+ echo "vlog2Verilog failed with exit status ${errcond}" |& tee -a ${synthlog}
+ echo "Premature exit." |& tee -a ${synthlog}
+ echo "Synthesis flow stopped on error condition." >>& ${synthlog}
+ exit 1
+ endif
+
+ echo "vlog2Verilog -c -b -p -n -v ${vddnet} -g ${gndnet} -o ${rootname}.rtlbb.v ${rootname}_anno.v" |& tee -a ${synthlog}
+ ${bindir}/vlog2Verilog -c -b -p -n -v ${vddnet} -g ${gndnet} \
+ -o ${rootname}.rtlbb.v ${rootname}_anno.v >>& ${synthlog}
+
+ set errcond = $status
+ if ( ${errcond} != 0 ) then
+ echo "vlog2Verilog failed with exit status ${errcond}" |& tee -a ${synthlog}
+ echo "Premature exit." |& tee -a ${synthlog}
+ echo "Synthesis flow stopped on error condition." >>& ${synthlog}
+ exit 1
+ endif
+
+ echo "Running vlog2Spice." |& tee -a ${synthlog}
+ echo "vlog2Spice -i -l ${spicepath} -o ${rootname}.spc ${rootname}.rtl.v" \
+ |& tee -a ${synthlog}
+ ${bindir}/vlog2Spice -i -l ${spicepath} -o ${rootname}.spc ${rootname}.rtl.v >>& ${synthlog}
+
+ set errcond = $status
+ if ( ${errcond} != 0 ) then
+ echo "vlog2Spice failed with exit status ${errcond}" |& tee -a ${synthlog}
+ echo "Premature exit." |& tee -a ${synthlog}
+ echo "Synthesis flow stopped on error condition." >>& ${synthlog}
+ exit 1
+ endif
+
+ #------------------------------------------------------------------
+ # Spot check: Did vlog2Verilog or vlog2Spice exit with an error?
+ #------------------------------------------------------------------
+
+ if ( ! -f ${rootname}.rtl.v || ( -M ${rootname}.rtl.v \
+ < -M ${rootname}_anno.v )) then
+ echo "vlog2Verilog failure: No file ${rootname}.rtl.v created." \
+ |& tee -a ${synthlog}
+ endif
+
+ if ( ! -f ${rootname}.rtlnopwr.v || ( -M ${rootname}.rtlnopwr.v \
+ < -M ${rootname}_anno.v )) then
+ echo "vlog2Verilog failure: No file ${rootname}.rtlnopwr.v created." \
+ |& tee -a ${synthlog}
+ endif
+
+ if ( ! -f ${rootname}.rtlbb.v || ( -M ${rootname}.rtlbb.v \
+ < -M ${rootname}_anno.v )) then
+ echo "vlog2Verilog failure: No file ${rootname}.rtlbb.v created." \
+ |& tee -a ${synthlog}
+ endif
+
+ if ( ! -f ${rootname}.spc || ( -M ${rootname}.spc \
+ < -M ${rootname}_anno.v )) then
+ echo "vlog2Spice failure: No file ${rootname}.spc created." \
+ |& tee -a ${synthlog}
+ endif
+
+ # Return to the layout directory
+ cd ${layoutdir}
+
+ endif
+endif
+
+#------------------------------------------------------------
+# Done!
+#------------------------------------------------------------
+
+set endtime = `date`
+echo "Placement script ended on $endtime" >> $synthlog
+
+exit 0