mirror of https://github.com/YosysHQ/icestorm.git
505 lines
13 KiB
Bash
505 lines
13 KiB
Bash
#!/bin/bash
|
|
#
|
|
# Installing iCEcube2:
|
|
# - Install iCEcube2.2015.08 in /opt/lscc/iCEcube2.2015.08
|
|
# - Install License in /opt/lscc/iCEcube2.2015.08/license.dat
|
|
#
|
|
# Creating a project:
|
|
# - <project_name>.v ## HDL sources (use "top" as name for the top module)
|
|
# - <project_name>.sdc ## timing constraint file
|
|
# - <project_name>.pcf ## physical constraint file
|
|
#
|
|
# Running iCEcube2:
|
|
# - bash icecube.sh [-1k|-8k|-384] <project_name> ## creates <project_name>.bin
|
|
#
|
|
#
|
|
#
|
|
# Additional notes for installing iCEcube2 on 64 Bit Ubuntu:
|
|
#
|
|
# sudo apt-get install libc6-i386 zlib1g:i386 libxext6:i386 libpng12-0:i386 libsm6:i386
|
|
# sudo apt-get install libxi6:i386 libxrender1:i386 libxrandr2:i386 libxfixes3:i386
|
|
# sudo apt-get install libxcursor1:i386 libxinerama1:i386 libfreetype6:i386
|
|
# sudo apt-get install libfontconfig1:i386 libglib2.0-0:i386 libstdc++6:i386 libelf1:i386
|
|
#
|
|
# icecubedir="/opt/lscc/iCEcube2.2015.08"
|
|
# sudo sed -ri "1 s,/bin/sh,/bin/bash,;" $icecubedir/synpbase/bin/synplify_pro
|
|
# sudo sed -ri "1 s,/bin/sh,/bin/bash,;" $icecubedir/synpbase/bin/c_hdl
|
|
# sudo sed -ri "1 s,/bin/sh,/bin/bash,;" $icecubedir/synpbase/bin/syn_nfilter
|
|
# sudo sed -ri "1 s,/bin/sh,/bin/bash,;" $icecubedir/synpbase/bin/m_generic
|
|
#
|
|
|
|
scriptdir=${BASH_SOURCE%/*}
|
|
if [ -z "$scriptdir" ]; then scriptdir="."; fi
|
|
|
|
if [ "$1" == "-1k" ]; then
|
|
ICEDEV=hx1k-tq144
|
|
shift
|
|
fi
|
|
|
|
if [ "$1" == "-8k" ]; then
|
|
ICEDEV=hx8k-ct256
|
|
shift
|
|
fi
|
|
|
|
if [ "$1" == "-384" ]; then
|
|
ICEDEV=lp384-cm49
|
|
shift
|
|
fi
|
|
|
|
if [ "$1" == "-ul1k" ]; then
|
|
ICEDEV=ul1k-cm36a
|
|
shift
|
|
fi
|
|
|
|
if [ "$1" == "-up5k" ]; then
|
|
ICEDEV=up5k-sg48
|
|
shift
|
|
fi
|
|
|
|
if [ "$1" == "-lm4k" ]; then
|
|
ICEDEV=lm4k-cm49
|
|
shift
|
|
fi
|
|
|
|
if [ "$1" == "-u4k" ]; then
|
|
ICEDEV=u4k-sg48
|
|
shift
|
|
fi
|
|
|
|
set -ex
|
|
set -- ${1%.v}
|
|
icecubedir="${ICECUBEDIR:-/opt/lscc/iCEcube2.2015.08}"
|
|
if [ -d $icecubedir/LSE/bin/lin64 ]; then lin_lin64=lin64; else lin_lin64=lin; fi
|
|
export FOUNDRY="$icecubedir/LSE"
|
|
export SBT_DIR="$icecubedir/sbt_backend"
|
|
export SYNPLIFY_PATH="$icecubedir/synpbase"
|
|
export LM_LICENSE_FILE="$icecubedir/license.dat"
|
|
export TCL_LIBRARY="$icecubedir/sbt_backend/bin/linux/lib/tcl8.4"
|
|
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH${LD_LIBRARY_PATH:+:}$icecubedir/sbt_backend/bin/linux/opt"
|
|
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH${LD_LIBRARY_PATH:+:}$icecubedir/sbt_backend/bin/linux/opt/synpwrap"
|
|
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH${LD_LIBRARY_PATH:+:}$icecubedir/sbt_backend/lib/linux/opt"
|
|
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH${LD_LIBRARY_PATH:+:}$icecubedir/LSE/bin/${lin_lin64}"
|
|
|
|
case "${ICEDEV:-hx1k-tq144}" in
|
|
hx1k-cb132)
|
|
iCEPACKAGE="CB132"
|
|
iCE40DEV="iCE40HX1K"
|
|
;;
|
|
hx1k-vq100)
|
|
iCEPACKAGE="VQ100"
|
|
iCE40DEV="iCE40HX1K"
|
|
;;
|
|
hx1k-tq144)
|
|
iCEPACKAGE="TQ144"
|
|
iCE40DEV="iCE40HX1K"
|
|
;;
|
|
hx4k-cb132)
|
|
iCEPACKAGE="CB132"
|
|
iCE40DEV="iCE40HX4K"
|
|
;;
|
|
hx4k-tq144)
|
|
iCEPACKAGE="TQ144"
|
|
iCE40DEV="iCE40HX4K"
|
|
;;
|
|
hx8k-cm225)
|
|
iCEPACKAGE="CM225"
|
|
iCE40DEV="iCE40HX8K"
|
|
;;
|
|
hx8k-ct256)
|
|
iCEPACKAGE="CT256"
|
|
iCE40DEV="iCE40HX8K"
|
|
;;
|
|
hx8k-cb132)
|
|
iCEPACKAGE="CB132"
|
|
iCE40DEV="iCE40HX8K"
|
|
;;
|
|
lp384-qn32)
|
|
iCEPACKAGE="QN32"
|
|
iCE40DEV="iCE40LP384"
|
|
;;
|
|
lp384-cm36)
|
|
iCEPACKAGE="CM36"
|
|
iCE40DEV="iCE40LP384"
|
|
;;
|
|
lp384-cm49)
|
|
iCEPACKAGE="CM49"
|
|
iCE40DEV="iCE40LP384"
|
|
;;
|
|
lp1k-swg16tr)
|
|
iCEPACKAGE="SWG16TR"
|
|
iCE40DEV="iCE40LP1K"
|
|
;;
|
|
lp1k-cm36)
|
|
iCEPACKAGE="CM36"
|
|
iCE40DEV="iCE40LP1K"
|
|
;;
|
|
lp1k-cm49)
|
|
iCEPACKAGE="CM49"
|
|
iCE40DEV="iCE40LP1K"
|
|
;;
|
|
lp1k-cm81)
|
|
iCEPACKAGE="CM81"
|
|
iCE40DEV="iCE40LP1K"
|
|
;;
|
|
lp1k-cm121)
|
|
iCEPACKAGE="CM121"
|
|
iCE40DEV="iCE40LP1K"
|
|
;;
|
|
lp1k-qn84)
|
|
iCEPACKAGE="QN84"
|
|
iCE40DEV="iCE40LP1K"
|
|
;;
|
|
lp1k-cb81)
|
|
iCEPACKAGE="CB81"
|
|
iCE40DEV="iCE40LP1K"
|
|
;;
|
|
lp1k-cb121)
|
|
iCEPACKAGE="CB121"
|
|
iCE40DEV="iCE40LP1K"
|
|
;;
|
|
lp4k-cm81)
|
|
iCEPACKAGE="CM81"
|
|
iCE40DEV="iCE40LP4K"
|
|
;;
|
|
lp4k-cm121)
|
|
iCEPACKAGE="CM121"
|
|
iCE40DEV="iCE40LP4K"
|
|
;;
|
|
lp4k-cm225)
|
|
iCEPACKAGE="CM225"
|
|
iCE40DEV="iCE40LP4K"
|
|
;;
|
|
lp8k-cm81)
|
|
iCEPACKAGE="CM81"
|
|
iCE40DEV="iCE40LP8K"
|
|
;;
|
|
lp8k-cm121)
|
|
iCEPACKAGE="CM121"
|
|
iCE40DEV="iCE40LP8K"
|
|
;;
|
|
lp8k-cm225)
|
|
iCEPACKAGE="CM225"
|
|
iCE40DEV="iCE40LP8K"
|
|
;;
|
|
ul1k-cm36a)
|
|
iCEPACKAGE="CM36A"
|
|
iCE40DEV="iCE40UL1K"
|
|
;;
|
|
ul1k-swg16)
|
|
iCEPACKAGE="CM36A"
|
|
iCE40DEV="iCE40UL1K"
|
|
;;
|
|
up5k-sg48)
|
|
iCEPACKAGE="SG48"
|
|
iCE40DEV="iCE40UP5K"
|
|
;;
|
|
up5k-uwg30)
|
|
iCEPACKAGE="UWG30"
|
|
iCE40DEV="iCE40UP5K"
|
|
;;
|
|
lm4k-cm49)
|
|
iCEPACKAGE="CM49"
|
|
iCE40DEV="iCE40LM4K"
|
|
;;
|
|
lm4k-cm36)
|
|
iCEPACKAGE="CM36"
|
|
iCE40DEV="iCE40LM4K"
|
|
;;
|
|
lm4k-swg25tr)
|
|
iCEPACKAGE="SWG25TR"
|
|
iCE40DEV="iCE40LM4K"
|
|
;;
|
|
lm2k-cm49)
|
|
iCEPACKAGE="CM49"
|
|
iCE40DEV="iCE40LM2K"
|
|
;;
|
|
lm2k-cm36)
|
|
iCEPACKAGE="CM36"
|
|
iCE40DEV="iCE40LM2K"
|
|
;;
|
|
lm2k-swg25tr)
|
|
iCEPACKAGE="SWG25TR"
|
|
iCE40DEV="iCE40LM2K"
|
|
;;
|
|
lm1k-cm49)
|
|
iCEPACKAGE="CM49"
|
|
iCE40DEV="iCE40LM1K"
|
|
;;
|
|
lm1k-cm36)
|
|
iCEPACKAGE="CM36"
|
|
iCE40DEV="iCE40LM1K"
|
|
;;
|
|
lm1k-swg25tr)
|
|
iCEPACKAGE="SWG25TR"
|
|
iCE40DEV="iCE40LM1K"
|
|
;;
|
|
u1k-sg48)
|
|
iCEPACKAGE="SG48"
|
|
iCE40DEV="iCE5LP1K"
|
|
;;
|
|
u4k-sg48)
|
|
iCEPACKAGE="SG48"
|
|
iCE40DEV="iCE5LP4K"
|
|
;;
|
|
*)
|
|
echo "ERROR: Invalid \$ICEDEV device config '$ICEDEV'."
|
|
exit 1
|
|
esac
|
|
|
|
case "$iCE40DEV" in
|
|
iCE40HX1K)
|
|
icetech="SBTiCE40"
|
|
libfile="ice40HX1K.lib"
|
|
devfile="ICE40P01.dev"
|
|
;;
|
|
iCE40HX4K)
|
|
icetech="SBTiCE40"
|
|
libfile="ice40HX8K.lib"
|
|
devfile="ICE40P04.dev"
|
|
;;
|
|
iCE40HX8K)
|
|
icetech="SBTiCE40"
|
|
libfile="ice40HX8K.lib"
|
|
devfile="ICE40P08.dev"
|
|
;;
|
|
iCE40LP384)
|
|
icetech="SBTiCE40"
|
|
libfile="ice40LP384.lib"
|
|
devfile="ICE40P03.dev"
|
|
;;
|
|
iCE40LP1K)
|
|
icetech="SBTiCE40"
|
|
libfile="ice40LP1K.lib"
|
|
devfile="ICE40P01.dev"
|
|
;;
|
|
iCE40LP4K)
|
|
icetech="SBTiCE40"
|
|
libfile="ice40LP8K.lib"
|
|
devfile="ICE40P04.dev"
|
|
;;
|
|
iCE40LP8K)
|
|
icetech="SBTiCE40"
|
|
libfile="ice40LP8K.lib"
|
|
devfile="ICE40P08.dev"
|
|
;;
|
|
iCE40UL1K)
|
|
icetech="SBTiCE40UL"
|
|
libfile="ice40BT1K.lib"
|
|
devfile="ICE40T01.dev"
|
|
;;
|
|
iCE40UP5K)
|
|
icetech="SBTiCE40UP"
|
|
libfile="ice40UP5K.lib"
|
|
devfile="ICE40T05.dev"
|
|
;;
|
|
iCE40LM1K)
|
|
icetech="SBTiCE40LM"
|
|
libfile="ice40LM4K.lib"
|
|
devfile="ICE40R04.dev"
|
|
;;
|
|
iCE40LM2K)
|
|
icetech="SBTiCE40LM"
|
|
libfile="ice40LM4K.lib"
|
|
devfile="ICE40R04.dev"
|
|
;;
|
|
iCE40LM4K)
|
|
icetech="SBTiCE40LM"
|
|
libfile="ice40LM4K.lib"
|
|
devfile="ICE40R04.dev"
|
|
;;
|
|
iCE5LP1K)
|
|
icetech="SBTiCE5LP"
|
|
libfile="ice40TH4K.lib"
|
|
devfile="ICE40T04.dev"
|
|
;;
|
|
iCE5LP4K)
|
|
icetech="SBTiCE5LP"
|
|
libfile="ice40TH4K.lib"
|
|
devfile="ICE40T04.dev"
|
|
;;
|
|
esac
|
|
|
|
(
|
|
rm -rf "$1.tmp"
|
|
mkdir -p "$1.tmp"
|
|
cp "$1.v" "$1.tmp/input.v"
|
|
if test -f "$1.sdc"; then cp "$1.sdc" "$1.tmp/input.sdc"; fi
|
|
if test -f "$1.pcf"; then cp "$1.pcf" "$1.tmp/input.pcf"; fi
|
|
cd "$1.tmp"
|
|
|
|
touch input.sdc
|
|
touch input.pcf
|
|
|
|
mkdir -p outputs/packer
|
|
mkdir -p outputs/placer
|
|
mkdir -p outputs/router
|
|
mkdir -p outputs/bitmap
|
|
mkdir -p outputs/netlist
|
|
mkdir -p netlist/Log/bitmap
|
|
|
|
cat > impl_syn.prj << EOT
|
|
add_file -verilog -lib work input.v
|
|
impl -add impl -type fpga
|
|
|
|
# implementation attributes
|
|
set_option -vlog_std v2001
|
|
set_option -project_relative_includes 1
|
|
|
|
# device options
|
|
set_option -technology $icetech
|
|
set_option -part $iCE40DEV
|
|
set_option -package $iCEPACKAGE
|
|
set_option -speed_grade
|
|
set_option -part_companion ""
|
|
|
|
# mapper_options
|
|
set_option -frequency auto
|
|
set_option -write_verilog 0
|
|
set_option -write_vhdl 0
|
|
|
|
# Silicon Blue iCE40
|
|
set_option -maxfan 10000
|
|
set_option -disable_io_insertion 0
|
|
set_option -pipe 1
|
|
set_option -retiming 0
|
|
set_option -update_models_cp 0
|
|
set_option -fixgatedclocks 2
|
|
set_option -fixgeneratedclocks 0
|
|
|
|
# NFilter
|
|
set_option -popfeed 0
|
|
set_option -constprop 0
|
|
set_option -createhierarchy 0
|
|
|
|
# sequential_optimization_options
|
|
set_option -symbolic_fsm_compiler 1
|
|
|
|
# Compiler Options
|
|
set_option -compiler_compatible 0
|
|
set_option -resource_sharing 1
|
|
|
|
# automatic place and route (vendor) options
|
|
set_option -write_apr_constraint 1
|
|
|
|
# set result format/file last
|
|
project -result_format edif
|
|
project -result_file impl.edf
|
|
impl -active impl
|
|
project -run synthesis -clean
|
|
EOT
|
|
|
|
cat > impl_lse.prj << EOT
|
|
#device
|
|
-a $icetech
|
|
-d $iCE40DEV
|
|
-t $iCEPACKAGE
|
|
#constraint file
|
|
|
|
#options
|
|
-optimization_goal Area
|
|
-twr_paths 3
|
|
-bram_utilization 100.00
|
|
-ramstyle Auto
|
|
-romstyle Auto
|
|
-use_carry_chain 1
|
|
-carry_chain_length 0
|
|
-resource_sharing 1
|
|
-propagate_constants 1
|
|
-remove_duplicate_regs 1
|
|
-max_fanout 10000
|
|
-fsm_encoding_style Auto
|
|
-use_io_insertion 1
|
|
-use_io_reg auto
|
|
-resolve_mixed_drivers 0
|
|
-RWCheckOnRam 0
|
|
-fix_gated_clocks 1
|
|
-loop_limit 1950
|
|
|
|
-ver "input.v"
|
|
-p "$PWD"
|
|
|
|
#set result format/file last
|
|
-output_edif impl/impl.edf
|
|
|
|
#set log file
|
|
-logfile "impl_lse.log"
|
|
EOT
|
|
|
|
# synthesis (Synplify Pro)
|
|
if false; then
|
|
"$icecubedir"/sbt_backend/bin/linux/opt/synpwrap/synpwrap -prj impl_syn.prj -log impl.srr
|
|
fi
|
|
|
|
# synthesis (Lattice LSE)
|
|
if true; then
|
|
"$icecubedir"/LSE/bin/${lin_lin64}/synthesis -f "impl_lse.prj"
|
|
fi
|
|
|
|
# convert netlist
|
|
"$icecubedir"/sbt_backend/bin/linux/opt/edifparser "$icecubedir"/sbt_backend/devices/$devfile "$PWD"/impl/impl.edf "$PWD"/netlist -p$iCEPACKAGE -yinput.pcf -sinput.sdc -c --devicename $iCE40DEV
|
|
|
|
# run placer
|
|
"$icecubedir"/sbt_backend/bin/linux/opt/sbtplacer --des-lib "$PWD"/netlist/oadb-top --outdir "$PWD"/outputs/placer --device-file "$icecubedir"/sbt_backend/devices/$devfile --package $iCEPACKAGE --deviceMarketName $iCE40DEV --sdc-file "$PWD"/Temp/sbt_temp.sdc --lib-file "$icecubedir"/sbt_backend/devices/$libfile --effort_level std --out-sdc-file "$PWD"/outputs/placer/top_pl.sdc
|
|
|
|
# run packer
|
|
"$icecubedir"/sbt_backend/bin/linux/opt/packer "$icecubedir"/sbt_backend/devices/$devfile "$PWD"/netlist/oadb-top --package $iCEPACKAGE --outdir "$PWD"/outputs/packer --translator "$icecubedir"/sbt_backend/bin/sdc_translator.tcl --src_sdc_file "$PWD"/outputs/placer/top_pl.sdc --dst_sdc_file "$PWD"/outputs/packer/top_pk.sdc --devicename $iCE40DEV
|
|
|
|
# run router
|
|
"$icecubedir"/sbt_backend/bin/linux/opt/sbrouter "$icecubedir"/sbt_backend/devices/$devfile "$PWD"/netlist/oadb-top "$icecubedir"/sbt_backend/devices/$libfile "$PWD"/outputs/packer/top_pk.sdc --outdir "$PWD"/outputs/router --sdf_file "$PWD"/outputs/netlist/top_sbt.sdf --pin_permutation
|
|
|
|
# run netlister
|
|
"$icecubedir"/sbt_backend/bin/linux/opt/netlister --verilog "$PWD"/outputs/netlist/top_sbt.v --vhdl "$PWD"/outputs/netlist/top_sbt.vhd --lib "$PWD"/netlist/oadb-top --view rt --device "$icecubedir"/sbt_backend/devices/$devfile --splitio --in-sdc-file "$PWD"/outputs/packer/top_pk.sdc --out-sdc-file "$PWD"/outputs/netlist/top_sbt.sdc
|
|
|
|
if [ -n "$ICE_SBTIMER_LP" ]; then
|
|
"$icecubedir"/sbt_backend/bin/linux/opt/sbtimer --des-lib "$PWD"/netlist/oadb-top --lib-file "$icecubedir"/sbt_backend/devices/$libfile --sdc-file "$PWD"/outputs/netlist/top_sbt.sdc --sdf-file "$PWD"/outputs/netlist/top_sbt_lp.sdf --report-file "$PWD"/outputs/netlist/top_timing_lp.rpt --device-file "$icecubedir"/sbt_backend/devices/$devfile --timing-summary
|
|
fi
|
|
|
|
# hacks for sbtimer so it knows what device we are dealing with
|
|
ln -fs . sbt
|
|
ln -fs . foobar_Implmnt
|
|
cat > foobar_sbt.project << EOT
|
|
[Project]
|
|
Implementations=foobar_Implmnt
|
|
|
|
[foobar_Implmnt]
|
|
DeviceFamily=$( echo $iCE40DEV | sed -re 's,(HX|5K|(iCE5LP)).*,\2,'; )
|
|
Device=$( echo $iCE40DEV | sed -re 's,(iCE40(UP|LP)?|iCE5LP),,'; )
|
|
DevicePackage=$iCEPACKAGE
|
|
Devicevoltage=1.14
|
|
DevicevoltagePerformance=+/-5%(datasheet default)
|
|
DeviceTemperature=85
|
|
TimingAnalysisBasedOn=Worst
|
|
OperationRange=Commercial
|
|
IOBankVoltages=topBank,2.5 bottomBank,2.5 leftBank,2.5 rightBank,2.5
|
|
derValue=0.701346
|
|
EOT
|
|
|
|
# run timer
|
|
"$icecubedir"/sbt_backend/bin/linux/opt/sbtimer --des-lib "$PWD"/foobar_Implmnt/sbt/netlist/oadb-top --lib-file "$icecubedir"/sbt_backend/devices/$libfile --sdc-file "$PWD"/outputs/netlist/top_sbt.sdc --sdf-file "$PWD"/outputs/netlist/top_sbt.sdf --report-file "$PWD"/outputs/netlist/top_timing.rpt --device-file "$icecubedir"/sbt_backend/devices/$devfile --timing-summary
|
|
|
|
# make bitmap
|
|
"$icecubedir"/sbt_backend/bin/linux/opt/bitmap "$icecubedir"/sbt_backend/devices/$devfile --design "$PWD"/netlist/oadb-top --device_name $iCE40DEV --package $iCEPACKAGE --outdir "$PWD"/outputs/bitmap --debug --low_power on --init_ram on --init_ram_bank 1111 --frequency low --warm_boot on
|
|
)
|
|
|
|
(
|
|
set +x
|
|
echo "export FOUNDRY=\"$FOUNDRY\""
|
|
echo "export SBT_DIR=\"$SBT_DIR\""
|
|
echo "export TCL_LIBRARY=\"$TCL_LIBRARY\""
|
|
echo "export LD_LIBRARY_PATH=\"$LD_LIBRARY_PATH\""
|
|
)
|
|
|
|
cp "$1.tmp"/outputs/bitmap/top_bitmap.bin "$1.bin"
|
|
cp "$1.tmp"/outputs/bitmap/top_bitmap_glb.txt "$1.glb"
|
|
cp "$1.tmp"/outputs/placer/top_sbt.pcf "$1.psb"
|
|
cp "$1.tmp"/outputs/netlist/top_sbt.v "$1.vsb"
|
|
cp "$1.tmp"/outputs/netlist/top_sbt.sdf "$1.sdf"
|
|
cp "$1.tmp"/outputs/netlist/top_timing.rpt "$1.rpt"
|
|
if [ -n "$ICE_SBTIMER_LP" ]; then
|
|
cp "$1.tmp"/outputs/netlist/top_sbt_lp.sdf "$1.slp"
|
|
cp "$1.tmp"/outputs/netlist/top_timing_lp.rpt "$1.rlp"
|
|
fi
|
|
|
|
export LD_LIBRARY_PATH=""
|
|
$scriptdir/../icepack/iceunpack "$1.bin" "$1.asc"
|