#######################################
#Author: Frédéric Pétrot
#Unlike most of the work I've done in Alliance, this very example
#is bilingual
#It was done for educational purpose at the well
#known École Polytechnique, and therefore written in French
#I rapidly translated the content to english in case it could
#be useful to someone
###########################################################

#Construit le projet complet
#Building the entire project.

 if [ -z "$ALLIANCE_TOP" ]; then
   alcEnv="/etc/profile.d/alc_env.sh"

   if [ ! -x "${alcEnv}" ]; then
     ALLIANCE_TOP="${HOME}/alliance/Linux.slsoc6x/install"

     alcEnv="${ALLIANCE_TOP}/etc/profile.d/alc_env.sh"
     if [ ! -f "${alcEnv}" ]; then
       alcEnv="${ALLIANCE_TOP}/etc/alc_env.sh"
     else
       echo "[ERROR] Cannot find alc_env.sh."
       exit 1
     fi
   fi
   . ${alcEnv}
 fi


export MBK_IN_LO=vst
export MBK_OUT_LO=vst

#Utilisez cet artefact pour commenter une partie du source
#Use this artifact to comment out part of this code, since
#I didn't want to use a Makefile for simplicity
#You ought to in real projects, however :)
if [ "x" = "y" ] ; then
echo -n ""
fi

#Simulation du comportement
#Simulate the behavior with simple patterns
genpat core
asimut -b tuner core result > /dev/null

#Optimisation combinatoire
#Multilevel boolean optimization
boom -V -s tuner tuner_o

#Vérification que le comportement optimisé est
#identique au comportement initial
#Check by simulation that the initial behaviour is identical to the
#optimized one
asimut -b tuner_o core result > /dev/null

#Vérification formelle de l'équivalence de deux comportements
#Formal verification of the équivalence of two sets of boolean
#equations and registers
proof tuner_o tuner

#Projection structurelle sur la bibliotheque standard
#Mapping of the behavior on the standard cell library
#export MBK_TARGET_LIB=$CELLS_TOP/sxlib
boog -m 0 tuner_o tuner_x

#Adaptation de la puissance des portes à leur charge
#Gate sizing to adapt the fanout
loon -x 0 -m 0 tuner_x tuner_o

#Vous pouvez lancer xsch pour voir l'allure de l'ensemble de portes
#Ce n'est pas très utile, mais ca rassure !
#You may lauch xsch to see the way your netlist looks
#Not really usefully but sometime pretty.
xsch -l tuner_o

#Vérification que l'interconnexion de portes logiques est
#identique au comportement initial
#Check by simulation that the gate netlist bahaves as the
#initial behaviour 
asimut -zd tuner_o core result > /dev/null

#Reconstruit un comportement à partir des feuilles de la netlist
#Build a behavior by inserting the gate behavior into the netlist
flatbeh tuner_o tuner_f

#Vérification formelle de l'équivalence de deux comportements
#Formal verification of the équivalence of two sets of boolean
#equations
proof tuner_f tuner

#Placement des cellules avec position des connecteurs imposée
#Cell placement with forced I/O pin positions
ocp -v -mdl 10 -ring -ioc tuner tuner_o tuner_p

#Routage des cellules avec 3 niveaux de metal
#Route the block with 3 levels of metal
nero -V -3 -p tuner_p tuner_o tuner_o

#Visualisation du circuit après placement/routage des cellules
#Look at the circuit after place and route
graal -l tuner_o

#Vérification que les règles de dessins symboliques n'ont pas
#été violées par le routeur
#Design rule checking to make sure the router did follow them
druc tuner_o

#Extraction de l'interconnexion de portes à partir des fils
#tirés par le routeur
#Extract the gate netlist after routing
cougar -f tuner_o tuner_x

#Vérification que les 2 interconnexions de portes sont isomorphes
#Check that the extracted graph is isomorphic to the initial one
lvx vst vst tuner_o tuner_x

#Ajout logique des plots d'entrées/sortie
#Adding the I/O pads
genlib tuner_io.c

#Génération des vecteurs de tests pour le circuit complet
#Produces (very few) test vectors for the whole circuit
genpat circuit

#Verification du circuit complet avec plots
#Check that inserting the pads was done correctly
asimut -zd tuner circuit result > /dev/null

#Routage du core et des plots
#Core to pad routing
ring tuner circuit

#Visualisation du circuit après routage du core et des plots
#Look a the circuit
graal -l circuit

#Vérification que les règles de dessins symboliques n'ont pas
#été violées par le routeur
#Design rule checking to make sure the router didn't fool up with
#layers
druc circuit

#Verification du travail de ring
#Extraction de la netlist plots/core
#Check was ring has done
#Extract the core to pad routing
cougar circuit

#Isomorphisme des graphes résultant
#Check for netlist isomorphism
lvx vst vst tuner circuit

#Transformation vers la pseudo-technologie
#Nous utilisons une pseudo technologie 0.5 micron 
#Adapt the symbolic layout to the target technology
#We use a fake 0.5 micron technology
export RDS_IN=cif
export RDS_OUT=cif
export RDS_TECHNO_NAME=./fake05.rds
export DREAL_TECHNO_NAME=./fake05.dreal
s2r -v circuit

#Visualisation du resultat
#And give it a look
dreal -l circuit

#Now, check the layout with your foundry DRC, ...
