#!/bin/tcsh -f

# Copy an interface logic of a given architecture to the user directory.
# The logic wraps around backend logic written by the user.
#
# An environment variable GWRAPPATH must be set to directory at which
# this script is installed.

if ( $?GWRAPPATH ) then
  set wdir = $GWRAPPATH
else if ( $?PGPG2PATH ) then
  set wdir = $PGPG2PATH/src/gwrap
  set GWRAPPATH = $wdir
else
    cat <<EOF
    An environment variable 'GWRAPPATH' must be set to directory at which
    this script itself is installed.
EOF
    exit
endif

if ($1 == 'f') then
  set interactive = ""
  shift
else
  set interactive = "-i"
endif

if (${#argv} < 2) then
    cat <<EOF

    This script generates interface logic suits of an given
    architecture <arch>. The interface logic wraps around backend
    logic <backend> written by the user.

    usage: gwrap_init [f] <arch> <backend>

        [f]: overwrite existing VHDL files.

        <arch>:
            dr3:     GRAPE-DR TB3 (preliminary)   PCIe x4       125MHz
            g7m1:    KFCR GRAPE-7 model100        PCI-X         133MHz
            g7m8:    KFCR GRAPE-7 model800        PCI-X         133MHz
            g7p1:    KFCR GRAPE-7 model300/600    pFPGA1,4      100MHz
            g7p2:    KFCR GRAPE-7 model300/600    pFPGA2,3,5    100MHz
            g7p6:    KFCR GRAPE-7 model300/600    pFPGA6        100MHz
            dkx4:    PLDA DesignKit               PCIe x4       125MHz
            gx2x4:   PLDA XpressGX2               PCIe x4       125MHz
            gx2x4f:  PLDA XpressGX2               PCIe x4       125MHz, fully licensed core
            gx2x8:   PLDA XpressGX2               PCIe x8       250MHz
            gx2x8f:  PLDA XpressGX2               PCIe x8       250MHz, fully licensed core

        <backend>: a VHDL file that contains the 'backend' entity.
            samples can be found at $GWRAPPATH/samples/
EOF
    exit
endif

set igen = $wdir/ifpgagen.pl
set udir = $PWD
set arch = $argv[1];
set backend = $argv[2];
echo "arch:${arch}    backend:${backend}"

if (! -e ${backend}) then
    echo "backend file not found. abort."
    exit
endif

set noclobber

set copy = "/bin/cp ${interactive}"
set move = "/bin/mv ${interactive}"

switch (${arch})

case g7p[126]:
    cd ${wdir}
    $igen ${arch} ${udir}/${backend} > ${udir}/tmp$$
    ${move} ${interactive} ${udir}/tmp$$ ${udir}/pfpga3.vhd
    rm ${udir}/tmp$$ >& /dev/null
    ${copy} ./pfpga3.qpf ${udir}/
    ${copy} ./pfpga_${arch}.qsf ${udir}/pfpga3.qsf
    ${copy} ./pfpgapll_g7.vhd ${udir}/pfpgapll.vhd
    ${copy} ./pfpgapll1_g7.vhd ${udir}/pfpgapll1.vhd
    ${copy} ./pfpgafifo64_g7.vhd ${udir}/pfpgafifo64.vhd
    ${copy} ./pfpgaddioin_g7.vhd ${udir}/pfpgaddioin.vhd
    ${copy} ./pfpgaddioout_g7.vhd ${udir}/pfpgaddioout.vhd
    cd ${udir}
    breaksw

case g7m1:
    cd ${wdir}
    $igen ${arch} ${udir}/${backend} > ${udir}/tmp$$
    ${move} ${interactive}  ${udir}/tmp$$ ${udir}/ifpga.vhd
    rm ${udir}/tmp$$ >& /dev/null
    ${copy} ./ifpga.qpf ${udir}/ifpga.qpf
    ${copy} ./ifpga_g7m1.qsf ${udir}/ifpga.qsf
    ${copy} ./ifpgapll_g7m1.vhd ${udir}/ifpgapll.vhd
    ${copy} ./ifpgapll1_g7m1.vhd ${udir}/ifpgapll1.vhd
    ${copy} ./hib_g7m1.vhd ${udir}/hib.vhd
    ${copy} ./pcixcore.vhd ${udir}/pcicore.vhd
    ${copy} ./hibscfifo_c2.vhd ${udir}/hibscfifo.vhd
    ${copy} ./hibdcram_c2.vhd ${udir}/hibdcram.vhd
    ${copy} ./hibdcrambe_c2.vhd ${udir}/hibdcrambe.vhd
    cd ${udir}
    breaksw

case g7m8:
    cd ${wdir}
    $igen ${arch} ${udir}/${backend} > ${udir}/tmp$$
    ${move} ${interactive}  ${udir}/tmp$$ ${udir}/ifpga.vhd
    rm ${udir}/tmp$$ >& /dev/null
    ${copy} ./ifpga.qpf               ${udir}/ifpga.qpf
    ${copy} ./ifpga_g7m8.qsf          ${udir}/ifpga.qsf
    ${copy} ./cg_c3.vhd               ${udir}/cg.vhd
    ${copy} ./cgpll0_c3.vhd           ${udir}/cgpll0.vhd
    ${copy} ./cgpll1_c3.vhd           ${udir}/cgpll1.vhd
    ${copy} ./cgdcfifo_c3.vhd         ${udir}/cgdcfifo.vhd
    ${copy} ./cgpllconf_c3.vhd        ${udir}/cgpllconf.vhd
    ${copy} ./cgpllconf_c3.mif        ${udir}/cgpllconf.mif
    ${copy} ./pcixcore.vhd            ${udir}/pcicore.vhd
    ${copy} ./hib_g7m8.vhd            ${udir}/hib.vhd
    ${copy} ./hibdcrambe_c3.vhd       ${udir}/hibdcrambe.vhd
    ${copy} ./hibscfifo_c3.vhd        ${udir}/hibscfifo.vhd
    ${copy} ./hibdcram_c3.vhd         ${udir}/hibdcram.vhd
    ${copy} ./asmi_c3.vhd             ${udir}/asmi.vhd
    ${copy} ./asmi_dcfifo_c3.vhd      ${udir}/asmi_dcfifo.vhd
    cd ${udir}
    breaksw

case dkx4:
    cd ${wdir}
    $igen ${arch} ${udir}/${backend} > ${udir}/tmp$$
    ${move} ${interactive}  ${udir}/tmp$$ ${udir}/ifpga.vhd
    rm ${udir}/tmp$$ >& /dev/null
    ${copy} ./ifpga.qpf ${udir}/ifpga.qpf
    ${copy} ./ifpga_dkx4.qsf ${udir}/ifpga.qsf
    ${copy} ./ifpgapll_gx2x4.vhd ${udir}/ifpgapll.vhd
    ${copy} ./hib_dkx4.vhd ${udir}/hib.vhd
    ${copy} ./pciecorex4.vhd ${udir}/pcicore.vhd
    ${copy} ./hibscfifo_sgx.vhd ${udir}/hibscfifo.vhd
    ${copy} ./hibdcram_sgx.vhd ${udir}/hibdcram.vhd
    ${copy} ./hibdcrambe_sgx.vhd ${udir}/hibdcrambe.vhd
    cd ${udir}
    breaksw

case gx2x4:
    cd ${wdir}
    $igen ${arch} ${udir}/${backend} > ${udir}/tmp$$
    ${move} ${interactive}  ${udir}/tmp$$ ${udir}/ifpga.vhd
    rm ${udir}/tmp$$ >& /dev/null
    ${copy} ./ifpga.qpf ${udir}/ifpga.qpf
    ${copy} ./ifpga_gx2x4.qsf ${udir}/ifpga.qsf
    ${copy} ./ifpgapll_gx2x4.vhd ${udir}/ifpgapll.vhd
    ${copy} ./hib_gx2x4.vhd ${udir}/hib.vhd
    ${copy} ./pciecorex4.vhd ${udir}/pcicore.vhd
    ${copy} ./hibscfifo_sgx2.vhd ${udir}/hibscfifo.vhd
    ${copy} ./hibdcram_sgx2.vhd ${udir}/hibdcram.vhd
    ${copy} ./hibdcrambe_sgx2.vhd ${udir}/hibdcrambe.vhd
    cd ${udir}
    breaksw

case gx2x4f:
    cd ${wdir}
    $igen ${arch} ${udir}/${backend} > ${udir}/tmp$$
    ${move} ${interactive}  ${udir}/tmp$$ ${udir}/ifpga.vhd
    rm ${udir}/tmp$$ >& /dev/null
    ${copy} ./ifpga.qpf ${udir}/ifpga.qpf
    ${copy} ./ifpga_gx2x4f.qsf ${udir}/ifpga.qsf
    ${copy} ./ifpgapll_gx2x4.vhd ${udir}/ifpgapll.vhd
    ${copy} ./hib_gx2x4f.vhd ${udir}/hib.vhd
    ${copy} ./pciecorex4f.vhd ${udir}/pcicore.vhd
    ${copy} ./hibscfifo_sgx2.vhd ${udir}/hibscfifo.vhd
    ${copy} ./hibdcram_sgx2.vhd ${udir}/hibdcram.vhd
    ${copy} ./hibdcrambe_sgx2.vhd ${udir}/hibdcrambe.vhd
    cd ${udir}
    breaksw

case gx2x8:
    cd ${wdir}
    $igen ${arch} ${udir}/${backend} > ${udir}/tmp$$
    ${move} ${interactive}  ${udir}/tmp$$ ${udir}/ifpga.vhd
    rm ${udir}/tmp$$ >& /dev/null
    ${copy} ./ifpga.qpf ${udir}/ifpga.qpf
    ${copy} ./ifpga_gx2x8.qsf ${udir}/ifpga.qsf
    ${copy} ./ifpgapll_gx2x8.vhd ${udir}/ifpgapll.vhd
    ${copy} ./hib_gx2x8.vhd ${udir}/hib.vhd
    ${copy} ./pciecorex8.vhd ${udir}/pcicore.vhd
    ${copy} ./hibscfifo_sgx2.vhd ${udir}/hibscfifo.vhd
    ${copy} ./hibdcram_sgx2.vhd ${udir}/hibdcram.vhd
    ${copy} ./hibdcrambe_sgx2.vhd ${udir}/hibdcrambe.vhd
    cd ${udir}
    breaksw

case gx2x8f:
    cd ${wdir}
    $igen ${arch} ${udir}/${backend} > ${udir}/tmp$$
    ${move} ${interactive}  ${udir}/tmp$$ ${udir}/ifpga.vhd
    rm ${udir}/tmp$$ >& /dev/null
    ${copy} ./ifpga.qpf ${udir}/ifpga.qpf
    ${copy} ./ifpga_gx2x8f.qsf ${udir}/ifpga.qsf
    ${copy} ./ifpgapll_gx2x8.vhd ${udir}/ifpgapll.vhd
    ${copy} ./hib_gx2x8f.vhd ${udir}/hib.vhd
    ${copy} ./pciecorex8f.vhd ${udir}/pcicore.vhd
    ${copy} ./hibscfifo_sgx2.vhd ${udir}/hibscfifo.vhd
    ${copy} ./hibdcram_sgx2.vhd ${udir}/hibdcram.vhd
    ${copy} ./hibdcrambe_sgx2.vhd ${udir}/hibdcrambe.vhd
    cd ${udir}
    breaksw

case dr3:
    cd ${wdir}
    $igen ${arch} ${udir}/${backend} > ${udir}/tmp$$
    ${move} ${interactive}  ${udir}/tmp$$ ${udir}/ifpga.vhd
    rm ${udir}/tmp$$ >& /dev/null
    ${copy} ./ifpga.qpf ${udir}/ifpga.qpf
    ${copy} ./ifpga_dr3.qsf ${udir}/ifpga.qsf
    ${copy} ./ifpgapll_gx2x4.vhd ${udir}/ifpgapll.vhd
    ${copy} ./hib_gx2x4f.vhd ${udir}/hib.vhd
    ${copy} ./pciecorex4f.vhd ${udir}/pcicore.vhd
    ${copy} ./hibscfifo_sgx2.vhd ${udir}/hibscfifo.vhd
    ${copy} ./hibdcram_sgx2.vhd ${udir}/hibdcram.vhd
    ${copy} ./hibdcrambe_sgx2.vhd ${udir}/hibdcrambe.vhd
    cd ${udir}
    breaksw

default:
    echo invalid arch. abort.
    exit
    breaksw
endsw
