#!/bin/bash 
err2="1"
opt="1"
opt2="1"
#param
#-c preklad do ccka
#-u bez akceleracie
#-s subor.c - zdanie zdrojoveho suboru
#-l no loop extract
while getopts "s:lcu"  OPTION 2>/dev/null  
  do
  case $OPTION in
  s) arg1="$OPTARG" err2="0";;
  l) opt="2" 
         echo "loop extract triggered"     ;; #izolovanie cyklov do samostatnych funkcii
  c) opt2="2" 
             ;; #back to C
  u) opt2="3"
             ;; #testovaci preklad bez akceleracie
  \?) err="1" ;;
  :)  err= "1" ;; 
      esac
  done 

if [ "1" -eq $err2  ]; 
      then
           exit 1
     fi  

if [ "3" -eq $opt2 ]; #priame prelozenie pre microblaze
    then
      microblaze-uclinux-gcc -mno-xl-soft-mul -mhard-float -mcpu=v7.30.b -Wall -DLINUX -I autogen_tmp/api/12-mb-petalinux/libwal -I autogen_tmp/api/12-mb-petalinux/libbce_step4 -c -o $arg1.o  $arg1
      microblaze-uclinux-gcc -L autogen_tmp/api/12-mb-petalinux/libwal -L autogen_tmp/api/12-mb-petalinux/libbce_config_step4 -o ${arg1:0:(-2)} $arg1.o -lwal -lbce_config
      cp ${arg1:0:(-2)} /tftpboot
      exit 0
   fi

len=${#arg1}
~/llvm3.0/llvm_install/bin/clang -O1 -emit-llvm -fno-inline-functions -S $arg1 -o autogen_tmp/${arg1:0:len-2}.ll

~/llvm3.0/llvm_install/bin/clang autogen_tmp/link/manager_empty.c -emit-llvm -S -o autogen_tmp/out.ll
echo "empty manager processed"
~/llvm3.0/llvm_obj/Debug+Asserts+Checks/bin/llvm-as autogen_tmp/out.ll
~/llvm3.0/llvm_obj/Debug+Asserts+Checks/bin/llvm-as autogen_tmp/${arg1:0:len-2}.ll

~/llvm3.0/llvm_obj/Debug+Asserts+Checks/bin/llvm-link autogen_tmp/out.bc autogen_tmp/${arg1:0:len-2}.bc -o autogen_tmp/${arg1:0:len-2}.bc
echo "linking original .ll with manager declarations"

~/llvm3.0/llvm_obj/Debug+Asserts+Checks/bin/llvm-dis autogen_tmp/${arg1:0:len-2}.bc

if [ "2" -eq $opt  ];   
     then 
           ~/llvm3.0/llvm_obj/Debug+Asserts+Checks/bin/opt autogen_tmp/${arg1:0:len-2}.ll -o autogen_tmp/${arg1:0:len-2}.ll  -loop-extract -S #extrahovanie cyklov-mem2reg-lcssa-
           echo "loop extract,SE,iv + loop simplify, mem2reg passes ready "
     fi 

echo "canonic, loopsimpl, mem2reg"
~/llvm3.0/llvm_obj/Debug+Asserts+Checks/bin/opt autogen_tmp/${arg1:0:len-2}.ll -o autogen_tmp/${arg1:0:len-2}_pass.ll -mem2reg  -loop-simplify -indvars -scalar-evolution -enable-iv-rewrite -S #canonicalizacia,-lcssa zjednodusenie cyklov



echo "acceleration pass"
echo "generating firmwares"
echo "integration of manager"
echo "generating firmware include header"
~/llvm3.0/llvm_obj/Debug+Asserts+Checks/bin/opt -load=LLVMAcc.so -acc autogen_tmp/${arg1:0:len-2}_pass.ll > autogen_tmp/${arg1:0:len-2}_pass.bc #2> /dev/null
echo "regenerating .ll source file"
~/llvm3.0/llvm_obj/Debug+Asserts+Checks/bin/llvm-dis autogen_tmp/${arg1:0:len-2}_pass.bc


#preklad do C 
if [ "2" -eq $opt2 ];
     then
           echo "recompiling to C"
           ~/llvm3.0/llvm_obj/Debug+Asserts+Checks/bin/llc autogen_tmp/${arg1:0:len-2}_pass.ll -march=c -o autogen_tmp/${arg1:0:len-2}_recomp.c
           echo "recomp succesfull### beginning pb firmware compilation ###"  
           #scan for generated firmwares 
           cd autogen_tmp
           for f in fw_*.c 
           do
                echo $f
                pbcc api/10-pb-firmware/pbbcelib.psmo $f -o ${f:0:(-2)}.h #>/dev/null  #PB firmware compilation using UTIA api for BCE workers
                echo "generated PicoBlaze firmware"

           done

for f in fw_*.h
do
cp $f link/$f
done
           cd ..
           echo "end of picoblaze firmware compilation"
           echo ""
           echo ""
           echo "### beginning MicroBlaze core compilation ###"
           microblaze-uclinux-gcc -mno-xl-soft-mul -mhard-float -mcpu=v7.30.b -Wall -DLINUX -I autogen_tmp/api/12-mb-petalinux/libwal -I autogen_tmp/api/12-mb-petalinux/libbce_step4 -c -o autogen_tmp/${arg1:0:len-2}.o  autogen_tmp/${arg1:0:len-2}_recomp.c autogen_tmp/link/fw_incl.c autogen_tmp/link/manager.c 
           echo "Integrating manager core "
           echo "MicroBlaze first stage compile complete with exit code $?"
           microblaze-uclinux-gcc -L autogen_tmp/api/12-mb-petalinux/libwal -L autogen_tmp/api/12-mb-petalinux/libbce_config_step4 -o ${arg1:0:len-2} autogen_tmp/${arg1:0:len-2}.o -lbce_config -lpthread  -lwal
           echo "Final API linking complete with exit code $?"
           echo "end of MicroBlaze core compilation final binary created"
           echo "Copy generated binary file to TFTP directory"
           cp ${arg1:0:len-2} /tftpboot
           echo "cleanup"
         # rm ${arg1:0:len-2}.o
        #   rm ${arg1:0:len-2}.ll
         #  rm ${arg1:0:len-2}_pass.bc
         #  rm ${arg1:0:len-2}.bc
     fi
