% vim: :spell spelllang=fr
\documentclass[11pt]{beamer}
\usetheme{Warsaw}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{my_listings}
%\usepackage{my_hyperref}
\usepackage{pgfplots}
\usepackage{math}
\usepackage{../common/internship}
\setbeamertemplate{navigation symbols}{}

\newcommand{\cf}{\textit{cf.}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\author[Théophile Bastian]{Théophile \textsc{Bastian} \\
    \small{Sous la supervision de Carl Seger et Mary Sheeran}}
\title{Soutenance de stage, M2}
\subtitle{Recherche de motifs et substitution dans des circuits électroniques}
\date{Février\,--\,Juin 2017}
%\subject{}
%\logo{}
\institute{\textit{Chalmers Tekniska Universitet}, Göteborg, Suède}
\begin{document}

\begin{frame}
	\titlepage{}
\end{frame}

\begin{frame}
\tableofcontents
\end{frame}

\section{Contexte}

\begin{frame}{Contexte}
    Matériel faillible
    \begin{itemize}
        \item Intel FDIV (Pentium, 1994)
        \item Skylake, Kaby Lake (2017)
        \item \ldots
    \end{itemize}

    $\implies$ dangereux, cher pour l'industrie. Solutions~?

    \begin{itemize}
        \item Tester, tester, tester. Simulation, FPGA, matériel, \ldots
        \item Test dirigé~? \emph{Symbolic Trajectory Evaluation}
        \item \alert{Matériel prouvé}
            \begin{itemize}
                \item Dès la conception~?
                \item Après coup~?
            \end{itemize}
    \end{itemize}
\end{frame}

\begin{frame}{Voss II}
    \begin{itemize}
        \item \alert{fl}~: langage fonctionnel, BDDs, STE, \ldots \\
            Langage généraliste du prouveur hardware, utilisé chez Intel

        \item Propriétaire~: C. Seger développe une alternative open source
            (Voss II)

        \item \emph{Idée}~: prouver un circuit simple puis le raffiner est plus
            aisé.

        \item Workflow~:
            \begin{itemize}
                \item Prouver un circuit simple~;
                \item le raffiner \emph{par transformations prouvées}.
            \end{itemize}

        \item Raffinements~: \alert{recherche de motifs}
        \item \alert{isomatch}~: bibliothèque C++ pour recherche de motifs.
    \end{itemize}
\end{frame}

\section{Problème}

\begin{frame}{Problèmes}
    \begin{enumerate}[A]
        \item Deux circuits sont-ils identiques~?
        \item Quelles sont les occurrences de $N$ dans $H$~?
            \pause{}
        \item (Avoir un code documenté, très propre, idiomatique, réutilisable)
    \end{enumerate}

    \pause{}

    \begin{itemize}
        \item A~: isomorphisme de graphes ($\implies$ circuits égaux). \\
            NP-hard. Cf. Babai.
        \item B~: isomorphisme de sous-graphes ($\implies$
            sous-circuit égal). \\
            NP-complet.

        \vspace{1em}

        \item Circuits~: processeurs entiers~? \emph{Très gros}.
        \item Transformations \emph{interactives}~: doit être \emph{rapide}.
    \end{itemize}
\end{frame}

\begin{frame}{Forme des circuits}
    \begin{itemize}
        \item Portes, plusieurs types (combinatoire, tristate, délai,
            assertion)
        \item Plusieurs pins par porte
        \item Fil~: plusieurs pins connectés \\
            ($\implies$ pas un graphe immédiatement)
        \item \alert{Niveaux de hiérarchie}~: porte \og{}groupe~\fg{}
    \end{itemize}
\end{frame}

\section{Approche de résolution}

\begin{frame}{Approche générale}
    \begin{itemize}
        \item \alert{Signatures}~: valeur 64 bits décrivant une porte du
            circuit. \\
            Rapide à calculer, rapide à comparer. \\
            Le plus discriminant possible.

            \pause{}\vspace{1em}

        \item \alert{Égalité}~: test des permutations, guidé par
            signatures. \\
            Interagit avec les signatures.

            \pause{}\vspace{1em}

        \item \alert{Recherche}~: algorithme d'Ullmann, guidé par signatures.
    \end{itemize}
\end{frame}

\subsection{Signatures}

\begin{frame}{Signature}
    \begin{itemize}
        \item Doit ignorer la \emph{représentation} du graphe
        \item Doit capturer tout ce qui est \emph{inhérent} au circuit
        \item Oublier les \emph{noms}, \emph{identifiants}~; on oublie les
            \alert{ordres}.

            \vspace{1em}

        \item Signature interne~: \emph{hashs} capturant le contenu de la porte
        \item On perd les relations entre portes \\
            $\leadsto$ signature d'ordre $n$.
    \end{itemize}
\end{frame}

\begin{frame}{Signature d'ordre $n$}
    Prendre en compte les voisins, mais pas d'IDs \\
    \quad $\leadsto$ Signature des voisins

    \pause{}

    \begin{align*}
        \sig_0(C) :&= \text{signature interne} \\
        \sig_{n+1}(C) :&=
            \sum_{e \in \text{entrée}} \sig_n(e)
            - \sum_{s \in \text{sortie}} \sig_n(s)
            + \text{sig. I/O}
            + \sig_0(C)
    \end{align*}

    \vspace{1em}
    \begin{itemize}
        \item $\sig_n$~: prend en compte \emph{à distance $n$}
        \item Signature I/O~: adjacence aux pins I/O du groupe parent
        \item Calcul~: temps linéaire
    \end{itemize}
\end{frame}

\subsection{Égalité de groupes}

\begin{frame}{Égalité de groupes}
    \begin{itemize}
        \item Algorithme naïf~: tester toutes les permutations
        \item Peu de permutations possibles~: \cf{} signatures
        \item Nombre de permutations calculable facilement
        \item Nombre trop élevé~: signatures d'ordre plus élevé
            \begin{itemize}
                \item Calculable linéairement (taille du groupe)
            \end{itemize}
        \item En pratique~: pas plus de 4 permutations
    \end{itemize}
\end{frame}

\subsection{Recherche de motifs}

\begin{frame}{Algorithme d'Ullmann}
    \begin{itemize}
        \item Algorithme de backtrack pour isomorphisme de sous-graphes
        \item Quelques heuristiques et optimisations mineures
        \item \emph{Raffinement}
    \end{itemize}

    \pause{}

    \begin{itemize}
        \item Pour chaque $i \in$ needle \\
            \quad{} Pour chaque $j \in$ haystack pouvant correspondre
                avec $i$ \\
            \quad\quad{} Pour chaque voisin $k$ de $i$ (needle) \\
            \quad\quad\quad{} Si $k$ ne correspond à aucun voisin de $j$ \\
            \quad\quad\quad\quad{} Supprimer la correspondance
        \item Itérer jusqu'à point fixe
    \end{itemize}
\end{frame}

\section{Performance}

\begin{frame}{Performance sur un processeur}
    \begin{itemize}
        \item Mesures~: processeur de \og{}système digital~\fg, architecture
            ARM\@. Opère sur des mots mémoire.
        \item $\sim 2000$ portes terminales, $\sim 240$ groupes
        \item Mesures sur un i7-3770, 8\,Go de RAM % chktex 8

            \vspace{1em}

        \item Signature d'ordre 2~: 105\,ms
        \item Signature d'ordre 10~: 224\,ms
        \item Test d'égalité~: 310\,ms
        \item Recherche de tous les (73) MUX~: 113\,ms
    \end{itemize}
\end{frame}

\begin{frame}{Linéarité du temps de signature}
    \begin{figure}
        \centering
        \begin{tikzpicture}[scale=0.8]
            \begin{axis}[
                    xlabel={Ordre de signature},
                ylabel={Temps (ms)},
                xmin=0, xmax=16,
                ymin=0, ymax=300,
                legend pos=north west,
                ymajorgrids=true,
                grid style=dashed,
            ]

                \addplot[
                    color=blue,
                mark=square,
            ]
                coordinates {
                    (2,105.4)
                (3,122.6)
                (4,140.1)
                (5,155.4)
                (6,171.2)
                (7,183.9)
                (8,198.3)
                (9,211.2)
                (10,224.3)
                (11,236.7)
                (12,248.5)
                (13,259.3)
                (14,271.7)
                (15,281.4)
            };
                \legend{-O3}
            \end{axis}
        \end{tikzpicture}
    \end{figure}
\end{frame}

\section*{Conclusion}

\begin{frame}{Conclusion}
    \begin{itemize}
        \item \emph{isomatch} fonctionne (beaucoup testé)
        \item \emph{isomatch} fonctionne assez vite
        \item En cours d'intégration à Voss II
        \item Passé sous silence~: beaucoup d'étapes de recherche de meilleures
            signatures
    \end{itemize}
    \vspace{2em}

    \begin{center}
        {\Huge Des questions~?}
    \end{center}
\end{frame}

\end{document}
