www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit eaabe98257aa18331c0c3880a8909e3e0c2dcf7b
parent 52b2e580ca1822d116e48358a536830ca0cae86c
Author: gduperon <gduperon@5d9ba3ac-444b-4713-9fb3-0b58e79229a2>
Date:   Sun, 11 Apr 2010 17:42:47 +0000

Affichage de blocs dataflow avec LaTeX

git-svn-id: https://projetud.info-ufr.univ-montp2.fr/svn/flin607-2009-gduperon@3 5d9ba3ac-444b-4713-9fb3-0b58e79229a2

Diffstat:
Arapport/rapport.sty | 388+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Arapport/rapport.tex | 117+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 505 insertions(+), 0 deletions(-)

diff --git a/rapport/rapport.sty b/rapport/rapport.sty @@ -0,0 +1,388 @@ +\tikzset{ + bloc/.style={ + rectangle, + rounded corners, + draw=black, + very thick, + }, + bloc-line/.style={ + minimum height=0.9em, + }, + bloc-label/.style={ + bloc-label-pos, + }, + bloc-label-pos/.style={ + color=blue, + inner sep=0, + }, + ports/.style={ + }, + in-ports/.style={ + ports, + anchor=east, + }, + out-ports/.style={ + ports, + anchor=west, + }, + dot/.style={ + coordinate, + circle, + inner sep=0pt, + outer sep=0pt,% Pour que les liaisons aillent jusque dans les cercles. + minimum size=2pt, + fill=black, + anchor=center, + }, + port-dot/.style={ + dot, + }, + port-label/.style={ + port-label-pos, + }, + port-label-pos/.style={ + color=black!66!white, + }, + in-port-dot/.style={ + port-dot, + }, + in-port-label/.style={ + port-label, + }, + in-port-label-pos/.style={ + port-label-pos, + }, + out-port-dot/.style={ + port-dot, + }, + out-port-label/.style={ + port-label, + }, + out-port-label-pos/.style={ + port-label-pos, + }, +} + + + +\newcount\bloc@counter + +\let\bloc@false\@nil +\def\bloc@true{t} + +\def\bloc@cell@split#1#2#3#4{% + \def\bloc@cell@present{#1}% + \def\bloc@cell@iotype{#2}% + \def\bloc@cell@name{#3}% + \def\bloc@cell@value{$#4$}% +} + +\def\bloc@cell@getvalues#1{% + \advance\bloc@counter by #1% + \getlistelement{\the\bloc@counter}{\bloc@elements}% + \expandafter\bloc@cell@split\listelement% +} + +\def\@bloc@makecells@dolabel{% + \ifx\bloc@cell@present\bloc@true% + \node[\bloc@cell@iotype-label] (\bloc@cell@name-label) at (\bloc@cell@name-label-pos) {\bloc@cell@value};% + \fi% +} + +% Columns : <Vertical-space><left-dot><in-port><label><out-port><right-dot> +\def\bloc@cell{% + \ifnum\pgfmatrixcurrentcolumn=1% + \node[bloc-line,inner xsep=0pt]{};% + \fi% + % + \bloc@counter=\pgfmatrixcurrentrow% + \multiply\bloc@counter by 3% + % + \ifnum\pgfmatrixcurrentcolumn=2% + \bloc@cell@getvalues{-2}% + \ifx\bloc@cell@present\bloc@true% + \node[in-port-dot,alias=\bloc@cell@name-dot] (\bloc@cell@name) {};% + \fi% + \fi% + \ifnum\pgfmatrixcurrentcolumn=3% + \bloc@cell@getvalues{-2}% + \ifx\bloc@cell@present\bloc@true% + \node[in-port-label-pos] (\bloc@cell@name-label-pos) {\hphantom{\bloc@cell@value}};% + \fi% + \fi% + \ifnum\pgfmatrixcurrentcolumn=4% + \bloc@cell@getvalues{-1}% + \ifx\bloc@cell@present\bloc@true% + \node[bloc-label-pos] (\bloc@cell@name-label-pos) {\hphantom{\bloc@cell@value}};% + \fi% + \fi% + \ifnum\pgfmatrixcurrentcolumn=5% + \bloc@cell@getvalues{0}% + \ifx\bloc@cell@present\bloc@true% + \node[out-port-label-pos] (\bloc@cell@name-label-pos) {\hphantom{\bloc@cell@value}};% + \fi% + \fi% + \ifnum\pgfmatrixcurrentcolumn=6% + \bloc@cell@getvalues{0}% + \ifx\bloc@cell@present\bloc@true% + \node[out-port-dot,alias=\bloc@cell@name-dot] (\bloc@cell@name) {};% + \fi% + \fi% +} + +\def\bloc@@makecells{% + \ifnum\bloc@count@column<6% + \bloc@counter=\bloc@count@column% + \advance\bloc@counter by 1% + \xdef\bloc@count@column{\the\bloc@counter}% + \expandafter\pgfmatrixnextcell\expandafter\bloc@@makecells% + \else% + \ifnum\bloc@count@row<\bloc@maxlines% + \xdef\bloc@count@column{0}% + \bloc@counter=\bloc@count@row% + \advance\bloc@counter by 1% + \xdef\bloc@count@row{\the\bloc@counter}% + \expandafter\expandafter\pgfmatrixendrow\expandafter\expandafter\bloc@@makecells% + \else% + \relax% Last cell, relax guy ! + \fi% + \fi% +} + +\def\bloc@makecells{% + \xdef\bloc@count@row{2}% + \xdef\bloc@count@column{0}% + \bloc@@makecells% +} + +\def\@bloc@makecells@labels{% + \ifx\getlistlength@list\empty% + \else% + % + \xdef\listelement{\expandafter\@car\getlistlength@list\@nil}% + \expandafter\bloc@cell@split\listelement% + \@bloc@makecells@dolabel% + \relax\relax% + % + \xdef\getlistlength@list{\expandafter\@cdr\getlistlength@list\@nil}% + \expandafter\@bloc@makecells@labels% + \fi% +} + +\def\bloc@makecells@labels#1{% + \bloc@counter=1% + \edef\getlistlength@list{#1{\relax}}% + \@bloc@makecells@labels% +} + +\def\@getlistelement{% + \ifx\getlistlength@list\empty% + \else% + % + \ifnum\bloc@counter=\getlistlength@index% + \xdef\listelement{\expandafter\@car\getlistlength@list\@nil}% + \fi% + \advance\bloc@counter by 1% + % + \xdef\getlistlength@list{\expandafter\@cdr\getlistlength@list\@nil}% + \expandafter\@getlistelement% + \fi% +} + +\def\getlistelement#1#2{% + \xdef\getlistlength@index{#1}% + \bloc@counter=1% + \edef\getlistlength@list{#2{\relax}}% + \@getlistelement% +} + +%\newcount\bloc@counter% +\def\@getlistlength{% + \ifx\getlistlength@list\empty% + \let\listlength\bloc@counter% + \else% + % + \advance\bloc@counter by 1% + % + \xdef\getlistlength@list{\expandafter\@cdr\getlistlength@list\@nil}% + \expandafter\@getlistlength% + \fi% +} + +\def\getlistlength#1{% + \bloc@counter=-1% + \def\getlistlength@list{#1{\relax}}% + \@getlistlength% +} + +\def\@@bloc@scanelement@split#1/#2/{% + \def\bloc@cell@name{#1}% + \ifx\bloc@scanelement@split@same\bloc@true% + \def\bloc@cell@value{#1}% + \else + \def\bloc@cell@value{#2}% + \expandafter\@gobble% + \fi +} +\def\@bloc@scanelement@split#1/#2/{% + \def\bloc@cell@name{#1}% + \def\bloc@cell@value{#2}% + \ifx\bloc@cell@value\empty% + \let\bloc@scanelement@split@same\bloc@true% + \else% + \let\bloc@scanelement@split@same\bloc@false% + \expandafter\@gobble% + \fi% +} + +\def\bloc@scanelement@split#1{% + \expandafter\@bloc@scanelement@split#1{\relax}// + \expandafter\@@bloc@scanelement@split#1// +} + +\def\bloc@makeelements{% + % A-t-on fait la dernière ligne ? + \bloc@counter=\bloc@backupcounter% + \ifnum\bloc@backupcounter<\bloc@maxlines% + \let\bloc@exitloop\bloc@fale + \else + \let\bloc@exitloop\bloc@true + \fi + % + % S'il reste des lignes à faire, on les fait : + \ifx\bloc@exitloop\bloc@false% + % Est-on sur un rang où on affiche les ports d'entrée ? + \ifx\bloc@inports@print\bloc@true% + \let\bloc@inports@print\bloc@false% + % Est-ce qu'on est entre le startline et le endline pour les ports d'entrée ? + \ifnum\bloc@counter>\bloc@inports@startline% + \ifnum\bloc@counter<\bloc@inports@endline% + % Si oui, on ajoute le port, dans les autres cas, on ajoute une cellule vide + \xdef\bloc@scan@inport{\expandafter\@car\bloc@inports\@nil}% + \expandafter\bloc@scanelement@split{\bloc@scan@inport}% + \xdef\bloc@elements{\bloc@elements{{t}{in-port}{\bloc@label@name-in-\bloc@cell@name}{\bloc@cell@value}}}% + \xdef\bloc@inports{\expandafter\@cdr\bloc@inports\@nil}% + \else% + \g@addto@macro\bloc@elements{{{f}{}{}{}}}% + \fi% + \else% + \g@addto@macro\bloc@elements{{{f}{}{}{}}}% + \fi% + \else% + \let\bloc@inports@print\bloc@true% + \g@addto@macro\bloc@elements{{{f}{}{}{}}}% + \fi% + % Fin port entrée + % + % Est-on sur le rang où on doit afficher le nom du bloc ? + \ifnum\bloc@counter=\bloc@labelline% + \xdef\bloc@elements{\bloc@elements{{t}{bloc}{\bloc@label@name}{\bloc@label@value}}}% + \else% + \g@addto@macro\bloc@elements{{{f}{}{}{}}}% + \fi% + % Fin nom du bloc + % + % Est-on sur un rang où on affiche les ports de sortie ? + \ifx\bloc@outports@print\bloc@true% + \let\bloc@outports@print\bloc@false% + % Est-ce qu'on est entre le startline et le endline pour les ports de sortie ? + \ifnum\bloc@counter>\bloc@outports@startline% + \ifnum\bloc@counter<\bloc@outports@endline% + % Si oui, on ajoute le port, dans les autres cas, on ajoute une cellule vide + \xdef\bloc@scan@outport{\expandafter\@car\bloc@outports\@nil}% + \expandafter\bloc@scanelement@split{\bloc@scan@outport}% + \xdef\bloc@elements{\bloc@elements{{t}{out-port}{\bloc@label@name-out-\bloc@cell@name}{\bloc@cell@value}}}% + \xdef\bloc@outports{\expandafter\@cdr\bloc@outports\@nil}% + \else% + \g@addto@macro\bloc@elements{{{f}{}{}{}}}% + \fi% + \else% + \g@addto@macro\bloc@elements{{{f}{}{}{}}}% + \fi% + \else% + \let\bloc@outports@print\bloc@true% + \g@addto@macro\bloc@elements{{{f}{}{}{}}}% + \fi% + % Fin port sortie + % + % On passe à la ligne suivante + \advance\bloc@counter by 1% + \xdef\bloc@backupcounter{\the\bloc@counter} + % Et on boucle + \expandafter\bloc@makeelements% + \fi% +} + +\def\@bloc#1#2#3{% + \expandafter\bloc@scanelement@split{#1}% + \let\bloc@label@name\bloc@cell@name% + \let\bloc@label@value\bloc@cell@value% + \def\bloc@inports{#2{}{}{}}% + \def\bloc@outports{#3{}{}{}}% + \getlistlength{#2}\edef\bloc@nbinports{\the\listlength}% + \getlistlength{#3}\edef\bloc@nboutports{\the\listlength}% + % + \ifnum\bloc@nbinports>\bloc@nboutports% + \bloc@counter=\bloc@nbinports% + \edef\bloc@labelline{\the\bloc@counter}% + \multiply\bloc@counter by 2% + \edef\bloc@maxlines{\the\bloc@counter}% + % + \bloc@counter=\bloc@nbinports% + \advance\bloc@counter by -\bloc@nboutports% + \edef\bloc@outports@startline{\the\bloc@counter}% + \advance\bloc@counter by \bloc@nboutports% + \advance\bloc@counter by \bloc@nboutports% + \edef\bloc@outports@endline{\the\bloc@counter}% + % + \edef\bloc@inports@startline{0}% + \edef\bloc@inports@endline{\bloc@maxlines}% + % + \def\bloc@inports@print{t}% + \ifodd\bloc@nboutports% + \ifodd\bloc@nbinports \let\bloc@outports@print\bloc@true \else \let\bloc@outports@print\bloc@false \fi% + \else% + \ifodd\bloc@nbinports \let\bloc@outports@print\bloc@false \else \let\bloc@outports@print\bloc@true \fi% + \fi% + \else% + \bloc@counter=\bloc@nboutports% + \edef\bloc@labelline{\the\bloc@counter}% + \multiply\bloc@counter by 2% + \edef\bloc@maxlines{\the\bloc@counter}% + % + \bloc@counter=\bloc@nboutports% + \advance\bloc@counter by -\bloc@nbinports% + \edef\bloc@inports@startline{\the\bloc@counter}% + \advance\bloc@counter by \bloc@nbinports% + \advance\bloc@counter by \bloc@nbinports% + \edef\bloc@inports@endline{\the\bloc@counter}% + % + \edef\bloc@outports@startline{0}% + \edef\bloc@outports@endline{\bloc@maxlines}% + % + \def\bloc@outports@print{t}% + \ifodd\bloc@nbinports% + \ifodd\bloc@nboutports \let\bloc@inports@print\bloc@true \else \let\bloc@inports@print\bloc@false \fi% + \else% + \ifodd\bloc@nboutports \let\bloc@inports@print\bloc@false \else \let\bloc@inports@print\bloc@true \fi% + \fi% + \fi% + % + \bloc@counter=1 % numéro de ligne + \xdef\bloc@backupcounter{\the\bloc@counter}% + % + \gdef\bloc@elements{}% + \bloc@makeelements% + % + \tikzset{\bloc@label@name/.append style={}}% + \matrix[bloc,execute at begin cell=\bloc@cell,\bloc@label@name] (\bloc@label@name) {% + \bloc@makecells\\% + };% + % + \bloc@makecells@labels\bloc@elements% +} + +\newcommand{\bloc}[1][f]{ + \def\bloc@mathnodes{#1} + \@bloc +} diff --git a/rapport/rapport.tex b/rapport/rapport.tex @@ -0,0 +1,117 @@ +\documentclass{article} + +\usepackage[T1]{fontenc} +\usepackage[utf8]{inputenc} +\usepackage[frenchb]{babel} +\usepackage{pgffor} +\usepackage{ifthen} + +\usepackage{tikz} +\usetikzlibrary{matrix,fit} + +\usepackage{rapport} + +\author{Georges Dupéron} +\title{Langage de programmation} + +\begin{document} + +\maketitle + +\section{Objectif} + +Le but de ce projet est de mettre au point un langage de programmation utilisant le paradigme du dataflow\footnote{http://en.wikipedia.org/wiki/Dataflow}, n'ayant pas de primitives fixes. +\section{Recherche} + +\subsection{Programme en dataflow} + +Examinons un programme simple exprimé dans le paradigme du dataflow~: + +\tikzset{ + bloc/.style={ + rectangle, + rounded corners, + draw=black, + very thick, + }, + bloc-label/.style={ + bloc-label-pos, + }, + bloc-label-pos/.style={ + color=blue, + inner sep=0, + }, + ports/.style={ + }, + in-ports/.style={ + ports, + anchor=east, + }, + out-ports/.style={ + ports, + anchor=west, + }, + dot/.style={ + coordinate, + circle, + inner sep=0pt, + minimum size=2pt, + fill=black, + }, + port-dot/.style={ + dot, + }, + port-label/.style={ + port-label-pos, + }, + port-label-pos/.style={ + color=black!66!white, + }, + in-port-dot/.style={ + port-dot, + }, + in-port-label/.style={ + port-label, + }, + in-port-label-pos/.style={ + port-label-pos, + }, + out-port-dot/.style={ + port-dot, + }, + out-port-label/.style={ + port-label, + }, + out-port-label-pos/.style={ + port-label-pos, + }, +} +\shorthandoff{:} +\begin{tikzpicture} + \node[bloc-label] (+1) {$+$}; + \matrix[in-ports] at (+1.west) (+1In) { + \node[in-port-label,in-port-dot] (+1A) [label=right:$A$] {};\\ + \node[in-port-label,in-port-dot] (+1B) [label=right:$B$] {};\\ + \node[in-port-label,in-port-dot] (+1C) [label=right:$C$] {};\\ + }; + \matrix[out-ports] at (+1.east) (+1Out) { + \node[out-port-label,out-port-dot] (+1A) [label=left:$D$] {};\\ + \node[out-port-label,out-port-dot] (+1B) [label=left:$E$] {};\\ + }; + \node[bloc, fit = (+1) (+1In) (+1Out)] {}; +\end{tikzpicture} +\shorthandon{:} + +\begin{tikzpicture} + \bloc[t]{b1/+}{{a}{b}{c}}{{d}{e}} + \tikzset{b2/.style={right of=b1-out-d,matrix anchor=b2-in-x.west}} + \bloc[t]{b2/\frac{x\times y}{z}}{{x}{y}{z}}{{t}} + \draw (b1-out-d) -- (b2-in-x); + \draw (b1-out-e) -- (b2-in-y); + \draw (b1-out-e) ++(0.5,0) node[dot] {} |- (b2-in-z); +\end{tikzpicture} + + + +\end{document} +