#!/bin/bash

# adder4_v is adder4 layout with vertical metal-2 or ALU2
# adder4_h is adder4 layout with horizontal metal-2 or ALU2

export OCP=sx_ocp
export NERO_H=sx_halu3_nero
export NERO_V=sx_valu3_nero
export PDV=pdv
export DRUC=druc
export COUGAR=cougar
export LVX=lvx
export S2R=s2r

export OCP_WIDEN=pnr_ocp_widen
export WIDE_FEEDTHS=pnr_wide_feedths
export BLOCK_INST=pnr_block_inst
export VIA_OVERLAP=pnr_via_do_overlap
export SIMPLE_BLOCK=pnr_simple_block

export RDS_TECHNO_100=/usr/share/pharosc/etc/sx100.rds
export RDS_TECHNO_013=/usr/share/pharosc/etc/sx013.rds
export TARGET_LIB=/usr/share/pharosc/alliance/cells/sxlib013
export SPI_MODEL=/usr/share/pharosc/etc/spimodel.cfg
export DREAL_TECHNO_100=/usr/share/pharosc/etc/s100.dreal
export GRAAL_TECHNO_100=/usr/share/pharosc/etc/s.graal
export DREAL_TECHNO_013=/usr/share/pharosc/etc/s013.dreal
export GRAAL_TECHNO_013=/usr/share/pharosc/etc/s.graal
export CATAL=SXLIB013

export RDS_TECHNO_NAME=$RDS_TECHNO_100
export MBK_TARGET_LIB=$TARGET_LIB
export MBK_SPI_MODEL=$SPI_MODEL
export DREAL_TECHNO_NAME=$DREAL_TECHNO_100
export GRAAL_TECHNO_NAME=$GRAAL_TECHNO_100

export MBK_WORK_LIB=.
export MBK_IN_LO=vst
export MBK_OUT_LO=vst
export MBK_CATA_LIB=$MBK_TARGET_LIB
cp $MBK_TARGET_LIB/$CATAL LOCAL_CATAL
export MBK_CATAL_NAME=LOCAL_CATAL
export MBK_IN_PH=ap
export MBK_OUT_PH=ap
$OCP -margin 0.10 -eqmargin -ioc ../adder4 -rows 4 adder4 adder4_p
$OCP_WIDEN adder4_p
$OCP -partial adder4_p -ioc ../adder4 adder4 adder4h_p
$OCP -partial adder4_p -ioc ../adder4 adder4 adder4v_p

# change ALU2 connectors to ALU3 for horizontal metal-2 (=metal-3 connectors N and S)
sed -i 's/^C  *\([^,][^,]*\),\([^,][^,]*\),\([^,][^,]*\),\([^,][^,]*\),\([^,][^,]*\),NORTH,ALU2/C \1,\2,\3,\4,\5,NORTH,ALU3/' adder4h_p.ap
sed -i 's/^C  *\([^,][^,]*\),\([^,][^,]*\),\([^,][^,]*\),\([^,][^,]*\),\([^,][^,]*\),SOUTH,ALU2/C \1,\2,\3,\4,\5,SOUTH,ALU3/' adder4h_p.ap
$BLOCK_INST adder4h_p H adder4h_bg
$BLOCK_INST adder4v_p V adder4v_bg

export NERO=$NERO_V
export MBK_WORK_LIB=.
export MBK_IN_LO=vst
export MBK_OUT_LO=vst
export MBK_CATA_LIB=$MBK_TARGET_LIB
export MBK_CATAL_NAME=LOCAL_CATAL
export MBK_IN_PH=ap
export MBK_OUT_PH=ap
#
#                 FIRST HORIZONTAL ROUTE
#
nice -10 $NERO -v -2 -L -p adder4h_p adder4 adder4h
#    o  Allocating grid size [40,41,3].
# o  Routing stats :
#    - routing iterations    := 10315
#    - re-routing iterations := 0
#    - ratio                 := 0%.

sed -i '/zzzblock/ d' adder4h.ap
$PDV adder4h
#  - ALU2 length  :=       1700  (average length := 41)
#  - ALU3 length  :=       1450  (average length := 51)
#  - Total length :=       3150  (average length := 42)
#  - Total VIA    :=        113
#
#               Fix metal end overlap of VIA
#
$VIA_OVERLAP adder4h H ALL

$SIMPLE_BLOCK adder4h TALU1 big
$SIMPLE_BLOCK adder4h TALU2 small
$SIMPLE_BLOCK adder4h TALU3 small
$SIMPLE_BLOCK adder4h TALU8 big

export NERO=$NERO_H
#
#                 FIRST VERTICAL ROUTE
#
nice -10 $NERO -v -2 -L -p adder4v_p adder4 adder4v
#    o  Allocating grid size [40,41,3].
# o  Routing stats :
#    - routing iterations    := 13255
#    - re-routing iterations := 3083
#    - ratio                 := 18.8701%.

sed -i '/zzzblock/ d' adder4v.ap
$PDV adder4v
#  - ALU2 length  :=       1435  (average length := 35)
#  - ALU3 length  :=       1675  (average length := 47)
#  - Total length :=       3110  (average length := 38)
#  - Total VIA    :=        168
#
#               Fix metal end overlap of VIA
#
$VIA_OVERLAP adder4v V ALL

$SIMPLE_BLOCK adder4v TALU1 big
$SIMPLE_BLOCK adder4v TALU2 small
$SIMPLE_BLOCK adder4v TALU3 small
$SIMPLE_BLOCK adder4v TALU4 small
$SIMPLE_BLOCK adder4v TALU8 big

export RDS_TECHNO_NAME=$RDS_TECHNO_100
export MBK_WORK_LIB=.
export RDS_IN=cif
export RDS_OUT=cif
export MBK_IN_PH=ap
export MBK_OUT_PH=ap
export MBK_CATAL_NAME=LOCAL_CATAL
#
# HORIZONTAL and VERTICAL DRC with 1um rules
#
$DRUC adder4h
# 0 errors
$DRUC adder4v
# 0 errors

export RDS_TECHNO_NAME=$RDS_TECHNO_100
export MBK_WORK_LIB=.
export MBK_IN_LO=vst
export MBK_OUT_LO=vst
export RDS_IN=cif
export RDS_OUT=cif
export MBK_CATA_LIB=$MBK_TARGET_LIB
cp $MBK_TARGET_LIB/$CATAL .
export MBK_CATAL_NAME=$CATAL
export MBK_IN_PH=ap
export MBK_OUT_PH=ap
#
#                 Extract netlist from layout
#
$COUGAR -v -ac adder4h adder4h_lay
$COUGAR -v -ac adder4v adder4v_lay

export MBK_WORK_LIB=.
export MBK_IN_LO=vst
export MBK_OUT_LO=vst
export MBK_CATA_LIB=$MBK_TARGET_LIB
cp $MBK_TARGET_LIB/$CATAL .
export MBK_CATAL_NAME=$CATAL
#
#                           LVS
#
$LVX vst vst adder4 adder4h_lay -f | grep '^***** Netlists' | tee adder4h.lvs
$LVX vst vst adder4 adder4v_lay -f | grep '^***** Netlists' | tee adder4v.lvs

export RDS_TECHNO_NAME=$RDS_TECHNO_013
export MBK_WORK_LIB=.
export RDS_IN=cif
export RDS_OUT=cif
export MBK_IN_PH=ap
export MBK_OUT_PH=ap
export MBK_CATA_LIB=$MBK_TARGET_LIB
cp $MBK_TARGET_LIB/$CATAL .
export MBK_CATAL_NAME=$CATAL
#
#                   DRC with 0.13um rules
#
$DRUC adder4h
$DRUC adder4v

export RDS_TECHNO_NAME=$RDS_TECHNO_013
export DREAL_TECHNO_NAME=$DREAL_TECHNO_013
export GRAAL_TECHNO_NAME=$GRAAL_TECHNO_013
export MBK_WORK_LIB=.
export RDS_IN=cif
export RDS_OUT=cif
export MBK_IN_PH=ap
export MBK_OUT_PH=ap
export MBK_CATA_LIB=.:$MBK_TARGET_LIB
cp $MBK_TARGET_LIB/$CATAL .
sed 's/ /usr/share/pharosc/' $CATAL > ${CATAL}_MERGE
export MBK_CATAL_NAME=${CATAL}_MERGE
#
#     Merge the CIF library cells to produce 0.13um layout
#
$S2R -v adder4h
$S2R -v adder4v

export RDS_TECHNO_NAME=$RDS_TECHNO_013
export DREAL_TECHNO_NAME=$DREAL_TECHNO_013
export GRAAL_TECHNO_NAME=$GRAAL_TECHNO_013
export MBK_WORK_LIB=.
export RDS_IN=gds
export RDS_OUT=gds
export MBK_IN_PH=ap
export MBK_OUT_PH=ap
export MBK_CATA_LIB=.:$MBK_TARGET_LIB
cp $MBK_TARGET_LIB/$CATAL .
sed 's/ /usr/share/pharosc/' $CATAL > ${CATAL}_MERGE
export MBK_CATAL_NAME=${CATAL}_MERGE
#
#                 Merge the GDS library cells
#
$S2R -v adder4h
$S2R -v adder4v

#
# Check and report the number of DRC and LVS errors
#
echo
for layout in adder4h adder4v
do
  drc_errors=$(grep -c 'ERROR Code' ${layout}.drc)
  if [ "$drc_errors" -eq 0 ]
  then
    echo "# No DRC errors in "$layout"."
  else
    echo "#! "$layout" has "$drc_errors" DRC errors. Please check."
  fi
  echo -n "# LVS result for "$layout" :"
  cat ${layout}.lvs
done

#export RDS_IN=cif
#export RDS_OUT=cif
#/usr/share/pharosc/bin/l2p -color -drawingsize=725x1068 -noheader -real -rflattentrans -nrfname -niname -nsname -scale=0.5 adder4
