% \iffalse meta-comment %<=*COPYRIGHT> %% Copyright (C) 2009-2012 by Martin Scharrer %% ---------------------------------------------------------------------- %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3 %% of this license or (at your option) any later version. %% The latest version of this license is in %% http://www.latex-project.org/lppl.txt %% and version 1.3 or later is part of all distributions of LaTeX %% version 2005/12/01 or later. %% %% This work has the LPPL maintenance status `maintained'. %% %% The Current Maintainer of this work is Martin Scharrer. %% %% This work consists of the files tikz-timing.dtx and tikz-timing.ins %% and the derived filebase tikz-timing*.sty. %% %<=/COPYRIGHT> % \fi % % \iffalse %<*driver> \ProvidesFile{tikz-timing.dtx}[% %<=*DATE> 2017/12/20 %<=/DATE> %<=*VERSION> v0.7f %<=/VERSION> DTX-File of 'tikz-timing' package.] \newif\ifprintversion % \fi \ifdefined\printversion \printversiontrue \fi \RequirePackage{filecontents} \begin{filecontents}{ydoc.cfg} % Intensionally empty \end{filecontents} \ifprintversion \documentclass{ltxdoc} \let\chapter\section \let\section\subsection \let\subsection\subsubsection \else \documentclass[landscape,12pt]{scrreprt} \usepackage{ydoc} \fi \GetFileInfo{tikz-timing.dtx} \usepackage{tikz-timing}[\filedate] \usepackage{hyperref} \usepackage{atbegshi} \usetikztiminglibrary{arrows,either,overlays,clockarrows,columntype} \usetikztiminglibrary{nicetabs,counters,advnodes,interval,ifsym} \tikzset{timing/no nice tabs} \tikzset{timing/interval/normal} \tikzset{timing/nodes/old center} \usetikzlibrary{plotmarks} \makeatother %%%^^A\usepackage[electronic]{ifsym} \usepackage{calc} \usepackage{graphicx} \usepackage{xcolor} \usepackage{tabularx} \usepackage{array} \usepackage{flafter,fnpos} \usepackage{booktabs} \usepackage{supertabular} %\usepackage{xtab} \usepackage{amsmath} \usepackage{flafter} \usepackage{placeins} \makeFNbottom \makeFNbelow \usepackage{microtype}[2005/10/28] \DisableLigatures{encoding = T1, family = tt* }% \newsavebox{\mysb} \newsavebox{\sba} \newsavebox{\sbb} \def\topfraction{0.91} \def\bottomfraction{0.95} \def\floatpagefraction{0.98} \def\textfraction{0.05} \setcounter{bottomnumber}{2} \usepackage{listings} \lstset{basicstyle=\ttfamily} \usepackage{shortvrb} \usepackage{newverbs} \MakeSpecialShortVerb{\qverb}{\"} \def\NewIn#1{ \marginpar{\strut\raggedleft\raisebox{.125ex}{\textcolor{black}{\emph{New in #1}}}}% } \def\ExtIn#1{ \marginpar{\strut\raggedleft\textcolor{black}{\emph{Extended in #1}}}% } \iffalse \def\thesection{\texorpdfstring{\LARGE\texttiming[X]{D{\arabic{section}}.1X[black]}}{\arabic{section}}} \def\thesubsection{\texorpdfstring{\Large\texttiming[X]{D{\arabic{section}}D{\arabic{subsection}}.1X[black]}}{\arabic{section}.\arabic{subsection}}} \def\thesubsubsection{\texorpdfstring{\large\texttiming[X]{D{\arabic{section}}D{\arabic{subsection}}D{\arabic{subsubsection}}.1X[black]}} {\arabic{section}.\arabic{subsection}.\arabic{subsubsection}}} %\def\timingsectionformat#1{% % \sbox{\mysb}{\tikz \draw node [timing/d/text] {#1};}% % \texttiming{ $ \wd\mysb / \tikztiming@xunit $ DD{#1} }% %} \renewcommand\section{\@startsection {section}{1}{\z@}% {-3.5ex \@plus -1ex \@minus -.2ex}% {2.3ex \@plus.2ex}% {\normalfont\Large\bfseries\sffamily}} %[#1]{\texorpdfstring{\larger\timingsectionformat{#2}}{#2}}} \renewcommand\subsection{\@startsection{subsection}{2}{\z@}% {-3.25ex\@plus -1ex \@minus -.2ex}% {1.5ex \@plus .2ex}% {\normalfont\large\bfseries\sffamily}} \renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}% {-3.25ex\@plus -1ex \@minus -.2ex}% {1.5ex \@plus .2ex}% {\normalfont\normalsize\bfseries\sffamily}} \fi \let\envv\env \let\css\cs \def\lib{\texttt} \def\library#1#2{\section{#2}\label{lib:#1}} \usepackage{xspace} \def\ie{i.e.\xspace} \def\eg{e.g.\xspace} \makeatletter % The following code is only needed to produce package examples and therefor not % included in the style file but might be written to an additional file. % \iffalse % %<*examplecode> % \fi % % \begin{environment}{tikztimingexampletable} % \begin{macrocode} \newenvironment{tikztimingexampletable}{% \begingroup \let\tikztimingtable@row\tikztimingexampletable@row \tikzset{timing/nice tabs} \tikztimingtable }{% \extracode \tableheader{Characters}{Resulting Diagram}% \tablerules \endtikztimingtable \endgroup }% % \end{macrocode} % \end{environment} % % \begin{macro}{\tikztimingexampletable@row}[1]{Row content} % \begin{macrocode} \long\def\tikztimingexampletable@row#1\\{% \def\tikztiming@text{#1}% \@onelevel@sanitize\tikztiming@text \tikztimingtable@row@@{\ttfamily\tikztiming@text}{#1}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztimingfullexampletable} % \begin{macrocode} \def\tikztimingfullexampletable{%^^A \begin{tikzpicture}[timing/picture,x=1em,y=1em,font=\sffamily] \tikzset{timing/d/background/.style={fill={gray!25},fill opacity=0.5}}% \let\chars\tikztiming@chars@default \node (charnode) at (0,0) {% \scalebox{0.4}% {\rotatebox{-45}{$\frac{\mbox{\rotatebox{45}{to}}}% {\mbox{\rotatebox{45}{from}}}$}}% }; \coordinate (charnodex) at (0.25,0);% \coordinate (charnodey) at (0,0);% \expandafter\foreach \expandafter\tchar \expandafter i\expandafter n\expandafter{\chars} {% \path (charnodex) ++(+2,0) node (charnodex) {\strut\tchar}; \path (charnodey) ++(0,-2) node (charnodey) {\strut\tchar}; }% \draw [line width=\heavyrulewidth] (charnodex) +(+1,+1) -- (-1,+1); \draw [line width=\lightrulewidth] (charnodex) +(+1,-1) -- (-1,-1); \draw [line width=\lightrulewidth] (charnodey) +(+1,-0.6) -- (+1,-1.4) (+1,-0.6) -- (+1,+0.6); \draw [line width=\heavyrulewidth] (charnodey) ++(-1,-1) -- +($ (2,0) + (charnodex) $); % \path (1.5,-2) node (charnodex) {\strut}; \coordinate (charnodex) at (charnodex.base); \coordinate (charnodey) at ($ (charnodex.base) + (0,2) $); \def\@tempa{\timing at (charnodey)} \foreach\xchar in \chars { \foreach\ychar in \chars { \path (charnodey) +(0,-2) node (charnodey) {}; \draw [xstep={\timingwidth/2.},ystep={\timingheight/2.},timing/grid, shift={(charnodey)}] (0,0) grid +(2,1); \expandafter\@tempa\expandafter{\ychar\xchar}; } \path (charnodex) ++(+2,0) node (charnodex) {}; \path (charnodex) ++(0,2) node (charnodey) {}; } \end{tikzpicture}%^^A } % \end{macrocode} % \end{macro} % % \iffalse % %<*driver> % \fi \makeatother \EnableCrossrefs %\CodelineIndex \RecordChanges \OnlyDescription \listfiles \DeleteShortVerb{\|} \def\pipe{|} \def\Pipe{{\normalfont\normalcolor\pipe}} \MakeShortVerb{\|} \begin{document} \DocInput{tikz-timing.dtx} \PrintChanges %\newpage\PrintIndex \end{document} % %<*doc> % \fi % % \CheckSum{5720} % % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z % Digits \0\1\2\3\4\5\6\7\8\9 % Exclamation \! Double quote \" Hash (number) \# % Dollar \$ Percent \% Ampersand \& % Acute accent \' Left paren \( Right paren \) % Asterisk \* Plus \+ Comma \, % Minus \- Point \. Solidus \/ % Colon \: Semicolon \; Less than \< % Equals \= Greater than \> Question mark \? % Commercial at \@ Left bracket \[ Backslash \\ % Right bracket \] Circumflex \^ Underscore \_ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % % % % \GetFileInfo{tikz-timing.dtx} % % \DoNotIndex{\newcommand,\newenvironment,\def,\edef,\xdef,\DeclareRobustCommand} % \DoNotIndex{\expandafter,\if,\else,\fi,\ifnum,\ifx,\let,\global,\long} % \DoNotIndex{\newcounter,\newcount,\message,\meaning,\noexpand,\relax,\value} % \DoNotIndex{\setcounter,\addtocounter,\advance,\afterassignment,\AtEndOfPackage} % \DoNotIndex{\ProvidesPackage,\providecommand,\RequirePackage,\empty,\begin,\end} % \DoNotIndex{\begingroup,\bgroup,\egroup,\endgroup,\csname,\endcsname,\@tempa} % \DoNotIndex{\ignorespaces,\lccode,\sffamily,\@gobble,\@ifundefined,\@for,\or} % \DoNotIndex{\@firstoftwo,\@ifnextchar,\@namedef,\@nameuse,\@secondoftwo} % \DoNotIndex{\@temptokena,\toks@,\BODY,\do,\g@addto@macro,\lowercase,\uppercase,\the} % \DoNotIndex{\height,\width,\slope,\style,\draw,\path,\newdraw,\newdrawns} % \DoNotIndex{\dslope,\zslope} % % \ifpdf % \hypersetup{% % pdfauthor = {Martin Scharrer }, % pdftitle = {The tikz-timing package, \fileversion\ from \filedate}, % pdfsubject = {Documentation of LaTeX package tikz-timing which allows the % easy creation of timing diagrams inside tikz pictures or text.}, % pdfkeywords = {tikz-timing, timing diagram, LaTeX} % }% % \fi % % \unless\ifprintversion % \begingroup % \makeatletter % \title{{\tikz[baseline=(N.base),timing/picture,timing/z/.style={},% % timing/unit=1.44*\f@size pt,timing/d/text/.style={},timing/d/background/.style={fill=black!10},timing/inline node/.append style={rectangle,inner sep=0pt,outer sep=0pt}] % \timing at (0,0) {1L N[shift={(0,0.5)}]{\strut The} .9L 3d{[alias=N]\strut tikz} $.5em/\xunit$Z 5d{\strut timing} 1.75H N[shift={(0,-0.5)}]{Package} 1.75H } ;}} % \author{Martin Scharrer} % \date{Version \fileversion\ -- \filedate} % \thispagestyle{empty} % \begin{titlepage} % \sffamily\bfseries % \parindent=0pt % \centering % \vspace*{2cm} % \resizebox{.75\textwidth}{!}{\Huge\@title} % \par\vspace*{.75cm} % \Large A \LaTeX\ Package for Timing Diagrams % \par\vspace*{1.5cm} % {\LARGE\@date} % \par\vspace*{2cm} % {\LARGE\@author % \par\smallskip} % {\Large\href{mailto:martin@scharrer-online.de}{martin@scharrer-online.de} % \par\vspace*{1.25cm}} % {\Large % WWW: \url{http://latex.scharrer-online.de/tikz-timing}\\[.5ex] % CTAN: \url{http://www.ctan.org/pkg/tikz-timing}\\[1.2ex] % \par\smallskip} % \end{titlepage} % \clearpage % \endgroup % % \else % % \null % \vspace*{-2em} % \begin{center} % \sffamily % \tikzset{timing/z/.style={black}, % timing/intext/.style={timing,line width=0.1ex}} % {\LARGE\sffamily The \raisebox{-0.66ex}{\Huge\textsf % {\texttiming[z]{3d{\strut tikz}z5d{\strut timing}0.2z}}} package}\\[3ex] % {\large Version \fileversion\ -- \filedate}\\[2ex] % {\large Martin Scharrer \\\normalsize % \url{martin@scharrer-online.de}\\[.8ex] % WWW: \url{http://latex.scharrer-online.de/tikz-timing}\\[.5ex] % CTAN: \url{http://www.ctan.org/pkg/tikz-timing}\\[1.2ex]} % \end{center} % \vspace{1.2em}% % \fi % % ^^A\vfill \noindent % ^^A\textbf{Note to Advanced Users:} This is a new package which internal % ^^Amacros might still change. Please only rely on the user macros for now. % % \clearpage % \enlargethispage{\baselineskip} % {\let\csd % \texttt\tableofcontents % \listof{example}{List of Examples} % } % \addtocontents{toc}{\vspace*{-1.5em}} % % \chapter{Introduction} % This package uses the \pkg[pgf]{tikz} package to produce timing diagrams % inside text or \envv{tikzpicture} environments. Also a tabular-like % environment is provided to produce a larger timing diagram with multiple % labeled signals and the possibility to add own drawing material. % Additional optional functionality is provided by libraries. % % The signal levels of the timing diagram can be given by corresponding % characters/letters like "H" for \emph{Logical High} or "L" for % \emph{Logical Low}. So e.g.\ "{HLZXD}" gives `\texttiming{HLZXD}'. % In order to fit (in)to normal text the diagram size (\ie its height, width and line width) % is defined relatively to the currently active font size. The diagram height is about the height of an % uppercase "X" (+$2\times\frac12$ line width). This way the diagrams % can also be scaled using font size commands like \cs{small}. % (Example: {\sffamily % \large X\texttiming{LH}X % \normalsize X\texttiming{LH}X % \small X\texttiming{LH}X % \footnotesize X\texttiming{LH}X % \scriptsize X\texttiming{LH}X % \tiny X\texttiming{LH}X % }) % \makeatletter % \def\iex#1{^^A % \def\@tempa{#1}\@onelevel@sanitize\@tempa % `\texttt{\@tempa}'~$\rightarrow$~`\texttiming{#1}'} % \makeatother % A single timing character produces a diagram with a width identical to its height % (\iex{H}). Longer diagrams can be produces by either % using the same character multiple times (\iex{HHH}) % or writing the width as number in front of the character (\iex{3.2H}). % For (partial) compatibility with similar packages lowercase characters only produce % a signal with half the width (\iex{h}, \iex{3.2h}). % % Recurring character combinations can be repeated using character groups % (\iex{3{hlz}}) or be defined as so called \emph{meta-characters} % ({\tikztimingmetachar{Y}{hlz} "Y"="hlz", \iex{3Y}}), % which are similar to a \TeX~macro. % Since v0.7 meta-characters can also include macro arguments. % % Additional features are the inclusion of in-line TikZ styles (\iex{H ;[orange] L}), % in-line nodes (\iex{2H N[rectangle](Name){Text} 2L}), automatic width calculations % ("H $ 1+\mymacro-\slope $ L "~$\rightarrow$~`\texttiming{H2.5L}') % and much more. % % \iffalse % \medskip % \DeleteShortVerb{\|} % \centerline{\texttiming[D]{ % 2{12{[yscale=.9,shift={(0,.05)}]D{}} % 13{[yscale=1.1,shift={(0,-.05)}]D{}};} % $\dslope$ D{} % }} % \MakeShortVerb{\|} % \medskip % \fi % % \iffalse % The package is build to make it possible to define new characters from scratch % or as modified copy of other characters. However, no user macros nor % documentation for this are provided at the moment. Interested \LaTeX\ users % should look at the default definitions at the end of the source code. % \fi % % \iffalse % \section{Similar Packages} % There a some packages which target the same application like the package % presented by this document. % % \begin{description} % \itempkg{ifsym} This package (using the |electronic| option) provides a % special font which contains graphical representation of the logical levels % high and low at the corresponding letter "H" and "L". The lower case % versions have only half the width of the uppercase ones. Also a transition % can be added using the "|" character which will (sometimes) be added % automatically between |HL| and |LH|. % The diagrams are created using the command |\textifsym|\marg{characters}, % e.g.\ \verb+\textifsym{H|L|h|l|H|L}+ results in % \DeleteShortVerb{\|} `\textifsym{H|L|h|l|H|L}'. % \MakeShortVerb{\|} % % There is no support for transition slopes and no support for new % user-defined logical levels. % % \itempkg[(CTAN)]{timing} This package also provides a font for the logical % levels but supports transition slopes and larger timing diagrams. This % package seems not been updated for a while. % % \itempkgnoctan[(TikZ Example Page)]{timing}% % {http://www.texample.net/tikz/examples/timing-diagram/} This package is % accidentally also called "timing.sty" and is not published on CTAN but on % the TikZ example website. It is a small package which is meant as an % example for the graphics package \texttt{tikz} which is used to draw the % diagram. The logical levels must be provided using macros like % `|\bit|\marg{0 or 1}\marg{length}'. % \end{description} % \fi % % \clearpage % \section{Changelog} % \begingroup % \renewcommand{\changes}[3]{\paragraph{#1 from #2}\begin{itemize}\item #3\end{itemize}} % \newenvironment{Changes}[2]{\paragraph{#1 from #2}\begin{itemize}\let\change\item}{\end{itemize}} % % \changes{v0.3}{2009/04/24}{First released version} % \changes{v0.4}{2009/05/03}{Added output routine which combines successive % occurrences of the same character. This improves screen display quality and % reduces rendering time and file size. % \item Removed own macros for lowercase characters. They % are now handled by the uppercase macros which receive half of the width. % Exceptions are possible like for the `m' character. % \item Added parser for rows in \env{tikztimingtable}. % This makes the syntax much more stable. Also replaced row counter with TikZ % coordinates which is more user-friendly. % \item User macros to draw grids and lines inside table. % \item In-line Nodes, \eg to mark positions inside the diagram.} % \changes{v0.4a}{2009/05/05}{Added \cs{tablerules} macro. Changed default style % of inline nodes to \texttt{coordinate}.} % \changes{v0.5}{2009/05/15}{Added PGF shape for timing diagrams. Added % meta-characters. Changed `M' character to use PGF decorations. Added special % `B' character to reduce width of next character. Changed \cs{timing} syntax to % include an `at' before the coordinate. Bug fix for use with the `calc' % package.} % \changes{v0.6}{2009/07/27}{Added ``forward'' modifier `\texttt{F}' as reverse % version of the ``backward'' modifier `\texttt{B}'. % \item Added support for % lower-case modifiers ``\texttt{b}', `\texttt{f}' and \texttt{n}'. % \item Added libaries for characters `\texttt{A}'/`\texttt{W}' for arrows and % '\texttt{E}' for uncertain low-to-high and high-to-low transitions.} % \changes{v0.6a}{2009/07/28}{Added library for overlay modifier `\texttt{O}'.} % % \begin{Changes}{v0.7}{2009/12/05} % \change New libraries: % \begin{description} % \item[\lib{clockarrows}] Library for clock arrows. % \item[\lib{columntype}] Library providing a timing column type for |tabular|. % \item[\lib{nicetabs}] Library to format \cs{tikztimingtable} like a |booktab| |tabular|. % \item[\lib{counters}] Library to defined counter characters which display an incrementing % counter value every time there are used. % \item[\lib{advnodes}] Library for advanced nodes with multiple anchor points. % \item[\lib{ifsym}] Library providing the same timing symbols and characters as the |ifsym| package % when loaded with the |electronic| option. % \end{description} % \change Additional experimental libraries: % \begin{description} % \item[\lib{interval}] Library to change color of "ZL", "ZH" etc. transitions to % indicate borders of an interval. % \item[\lib{beamer}] Library providing some marginal beamer overlay support. % \end{description} % \change \lib{overlays} library: % \begin{itemize} % \item Overlays can now be cascaded, \ie an overlay can be inside another one. % \item The second braces around the second part are now optional. % \item Fixed issues with "T" and "C" characters inside overlays. % \end{itemize} % \change Meta-characters can now have arguments. % \change Added more variety for in-line options: "[[ ]]", "[+ +]" and "[| |]". % \change Handling of in-line options and nodes got modified. Options are now placed directly % where placed and are valid until the next ";". Please note that |[/utils/exec={..}]| now % needs to be written as \verb+[|/utils/exec={..}|]+. Otherwise it is re-executed every time % the drawing path is renewed. % \change Added star version of \cs{tablegrid}. % \change Added background to "E" character (\lib{either} library). % \change Some fixes for placing of "D{}" texts. % \change Fixed wrong slopes (\eg |lslope| instead of |zslope|) for some transitions. % \change Major changes on internal character definition macros, parser and output routine. % \change Fixed problems with expanding code content in user input. % \change The \cs{texttiming} macro now uses a \cs{timing} macro internally. % \change The \cs{timing} macro is now only defined inside |tikzpictures|. % This includes |tikztimingtable|. % \change Added TikZ style |timing/draw grid| for grids behind \cs{timing} macros. % \change Replaced macros \cs{texttimingbefore}, \cs{texttimingafter} and \cs{texttiminggrid} with % TikZ settings "timing/before text", "timing/after text" and "timing/draw grid". % \change Added separators "timing/outer sep" around \cs{texttiming}. % \change Graphical improvements for `double line' characters like "D", "U" and "E". % The whole character including both edges is drawn in a single process. % \change Character width can now be scaled using |wscale|. % \change Character width can now be calculated by placing code inside "$ $". % \change Fixed issue with \cs{horlines} macro. % \change The \env{tikztimingtable} environment and associated macros got enhanced: % \begin{itemize} % \item The content is no longer read as macro argument and can now include paragraphs. % \item Multiple |extracode| sections can be now included between rows, not only a single % section at the very end. % \item A \env{extracode} environment has been added. Both macro and environment have now % an optional argument for TikZ settings. % \item Added \cs{tableheader} macro to label both columns. The \cs{tablerules} macro got % adjusted to detect the header line and draw also a middle line. % \item Added \env{background} environment to draw things in the background. % \item Fixed broken optional argument of \cs{tablegrid}. % \item Added macro \cs{marknodes} and associated |debug/nodes| style to mark in-line nodes % for debug purposes/orientation during the diagram creation. % \end{itemize} % \end{Changes} % \changes{v0.7d}{2011/01/09}{Fix for end macro of extracode environment to support etoolbox's environment hooks.} % \changes{v0.7e}{2017/12/10}{Fixed advnodes library to support current PGF version.} % \changes{v0.7e}{2017/12/10}{Documentation update: added usage as float with caption due to user request.} % \changes{v0.7f}{2017/12/20}{Documentation update: added description of several existing styles.} % % % \endgroup % % \section{Dependencies} % \dots % % \clearpage % \chapter{Usage} % % \section{Timing Characters} % The logic levels are described by so called \emph{timing characters}. Actually % all of them are letters, but the general term \emph{character} is used here. % Table~\ref{tab:chars} shows all by default defined logic characters and % Table~\ref{tab:full} all possible two-character transitions. Additional % functionality is provided by the \emph{modifiers} shown in % Table~\ref{tab:modifiers}. % % \sbox{\sba}{%^^A % \sffamily % \tikzset{timing/draw grid} % \begin{tabular}{clccc} % \toprule % Character & Description & Diagram & Transition \\ % & & & Example \\ % \midrule % \texttt{H} & High & \texttiming{H} & \texttiming[L]{H} \\ % \texttt{L} & Low & \texttiming{L} & \texttiming[H]{L} \\ % \texttt{Z} & High Impedance & \texttiming{Z} & \texttiming[L]{Z} \\ % \texttt{X} & Undefined / Don't Care & \texttiming{X} & \texttiming[L]{X} \\ % \texttt{D} & Data / Double & \texttiming{D} & \texttiming[L]{D{A}D} \\ % \texttt{U} & Unknown Data & \texttiming{U} & \texttiming[D]{U} \\ % \texttt{T} & Toggle & \texttiming{L} or \texttiming{H} & \texttiming{TTTT} \\ % \texttt{C} & Clock (no slope) & \texttiming{L} or \texttiming{H} & \texttiming{CCCC} \\ % \texttt{M} & Metastable Condition & \texttiming{M} & \texttiming[H]{Ml} \\ % \midrule % \texttt{G} & Glitch (zero width) & \texttiming{G} & \texttiming{HGH} \\ % \texttt{S} & Space (nothing) & \texttiming{S} & \texttiming{HSL} \\ % \bottomrule % \end{tabular} % }%^^A % % \sbox{\sbb}{%^^A % \tikzset{timing/draw grid} % \sffamily\small % \tikztimingfullexampletable % }%^^A % % \ifprintversion % % \begin{table} % \centering % \caption{Timing Characters}\label{tab:chars} % \usebox{\sba} % \end{table} % % \begin{table} % \caption{Overview over all transitions.} % \label{tab:full} % \usebox{\sbb} % \end{table} % % \else % % \begin{table} % \sffamily % \centering % \pgfmathparse{max(\wd\sba+\wd\sbb+1em,\textwidth)}%^^A % \makebox[\textwidth][c]{%^^A % \begin{minipage}{\wd\sba} % \caption{Timing Characters} % \label{tab:chars} % \usebox{\sba} % \end{minipage}%^^A % \hspace{1em}\hfill % \begin{minipage}{\wd\sbb} % \caption{Overview over all transitions.} % \label{tab:full} % \usebox{\sbb} % \end{minipage}%^^A % }%^^A % \end{table} % % \fi % % \clearpage % \DeleteShortVerb{\|} % \begingroup^^A{table}[b] % \tikzset{timing/draw grid} % \let\normalfont\sffamily % \sffamily\centering % \makeatletter % % \tablecaption{Modifiers for Timing Characters.} % \label{tab:modifiers} % \def\en{\,\textsf{--}\,} % \let\origtabular\tabular % \let\endorigtabular\endtabular % \def\tabular{\begingroup % \setbox\mysb\hbox\bgroup % \origtabular}% % \def\endtabular{\endorigtabular\egroup\makebox[\textwidth][c]{\usebox\mysb} % \endgroup}% % \tablefirsthead{% % \toprule % \normalfont % Modifier Syntax & Description \\ % \midrule % }% % \tablehead{% % \multicolumn{2}{c}% % {\raisebox{\belowcaptionskip}{\tablename\ \thetable{} -- % continued from previous page}} \\ % \toprule % \normalfont % Modifier Syntax & Description \\ % \midrule % }% % \tabletail{% % \bottomrule % ^^A\multicolumn{2}{r}{Continued on next page}\\ % } % \tablelasttail{% % \bottomrule % } % \def\Example#1{\def\@tempa{#1}\@onelevel@sanitize\@tempa % \hbox{\emph{E.g.:} `\hbox{\texttt{\@tempa}}' $\to$ \texttiming{#1}}} % \begin{supertabular}{>{\ttfamily}l>{\raggedright\arraybackslash}p{.85\textwidth}} % D\{\}D & Produces transition between two data values. \Example{D{}D} \\ % D\{\meta{Text}\} & Adds \meta{text} into a data signal using a node. % \Example{D{A}D{B}} \\ % D\{[\meta{\scriptsize % \raisebox{-1ex}{\shortstack{TikZ\\Settings}}}]\meta{Text}\} & Adds \meta{text} % using the given node \meta{settings}. \Example{D{[blue]A}} \\ % \meta{\small number}\meta{\small character} & Sets width of next signal to % given number. Half of it if character is in lower case. % \Example{2.6H5.2l}\\ % \meta{\small integer}\{\meta{\small characters}\} & Repeats the given % characters \texttt{\meta{int}} times. \Example{5{hl}}\\ % \{ \meta{\small characters} \} & Encloses characters in a local scope. Options inside are only % local to the scope. This also applies to the effect of `\texttt{;}' and similar modifiers. % \Example{H {[blue] LH} L}\\ % \midrule % \meta{\small number}B & Su\underline{b}tracts the given number from the width % of the next character. ``\textit{\texttt{B}ackwards}'' % \Example{H.5BL}\\ % \meta{\small number}F & Adds the given number to the width of the next % character. ``\textit{\texttt{F}orwards}'' \Example{H.5FL}\\ % N\oarg{\tiny Settings}\parg{\tiny Name}\marg{\tiny Content} & Adds node at % current position. All three arguments are optional. \Example{H N(a1) L}\\ % \midrule % {}[\meta{TikZ Keys}] & Executes given TikZ settings during the drawing % process. This settings will be re-executed when the internal drawing path is renewed which % can cause side-effects. \Example{H[blue]LH} \\ % {}[|\meta{TikZ Keys}|] & Executes given TikZ settings during the drawing % process like \texttt{[ ]} but does not re-executes them. % {\Example{D{.} [|/utils/exec={\def\m{...}}|] D{.} D{.}}} \\ % {}[!\meta{TikZ Keys}!] & Executes given TikZ settings during the % \emph{parsing} process. Because this makes only sense for internal settings % the default path is `\texttt{/tikz/timing}', not `\texttt{/tikz}' like in all % other settings macros. \Example{H[!wscale=2.5!]LH} \\ % {}[[\meta{TikZ Keys}]] & Executes given TikZ settings first during the % parsing process and again during the drawing process. This is for settings % which are needed for width calculations and again for the drawing code, \eg % the slope values. \Example{H[[timing/slope=.5]]L $\slope$H} \\ % \midrule % !\{\meta{code}\} & Places given code into the internal \envv{tikzpicture}. % See Example~\ref{exa:adv}. \\ % @\{\meta{code}\} & Executes the given code immediately during the parsing % process. This can be used to change parsing parameters. To execute code during % the drawing process use \verb+[|/utils/exec=+\meta{code}\verb+|]+ instead. % \Example{L @{\setwscale{2}} H} \\ % \texttt{\$}\meta{math expression}\texttt{\$} & Takes a valid \texttt{pgfmath} % expression (See \pkg{pgf} manual), evaluates it and places the result back in % the input string so it can be used as width for the next character. The macros % \cs{slope}=\cs{lslope}, \cs{dslope}, \cs{zslope} and \cs{wscale} can be used % to access the corresponding values. \Example{D{} $ \dslope $ D{} D} \\ % \midrule % ; & Renews the internal drawing path which ends the scope of all options % given by \texttt{[\,]}. \Example{H;[blue]L;H} \\ % , & Same as `\texttt{;}', but timing specific options (atm.: slopes and line % width) are restored for the new path. \Example{[line width=1pt]L,H;L} \\ % \end{supertabular} % \endgroup % \MakeShortVerb{\|} % % \clearpage % \section{Macro for use in Text Mode} % \vspace{-\bigskipamount}% % \DescribeMacro\texttiming[]{} % This macro places a single timing diagram line into the current text. The % signals have the same height as a uppercase letter (like `X') of the current % font, \ie they scale with the font size. % The macro argument must contain only valid logic characters and modifiers % which define the logical levels of the diagram line. % % An initial character can be given as an optional argument. No logic level will % be drawn for this character. Instead it will be used to define the initial % position of the signal so that the diagram line will start with a transition % from the initial to the first character. However, if the optional argument % holds more than a single character it is taken as TikZ settings for the % diagram. The initial character can then be given using the key % `|timing/initchar=|\meta{char}'. % % \par\medskip\noindent % \begin{minipage}{\textwidth}\noindent % \textit{Examples:}\\*[\smallskipamount]\hspace*{\parindent}% % \begin{minipage}{\textwidth-4\parindent} % \small |\texttiming{HLZDZLH}|^^A % \phantom{\texttt{[L]}} gives `\texttiming{HLZDZLH}', with grid: % `{\let\texttimingbefore\texttiminggrid\texttiming{HLZDZLH}}'.\\ % |\texttiming[L]{HLZDZLH}| ^^A % gives `\texttiming[L]{HLZDZLH}', with grid: % `{\let\texttimingbefore\texttiminggrid\texttiming[L]{HLZDZLH}}'.\\ % |\texttiming[green]{HLZDZLH}| ^^A % gives `\texttiming[green]{HLZDZLH}'\\ % |\texttiming[green,timing/initchar=L]{HLZDZLH}| ^^A % gives `\texttiming[green,timing/initchar=L]{HLZDZLH}' % \end{minipage} % \end{minipage} % % \DescribeMacro\texttimingbefore!{\hspace{2em}\textbf{Deprecated!}\hspace{8em}(\emph{defaults to}: \meta{empty})}! % \DescribeMacro\texttimingafter!{\hspace{2.5em}\textbf{Deprecated!}\hspace{8em}(\emph{defaults to}: \meta{empty})}! % This two macros are executed before and after every timing diagram line % created by \cs{texttiming} macro inside the same \envv{tikzpicture} % environment and can be used to add drawing macros. The argument of the % \cs{texttiming} macro is already processed before any of these macros are % expanded, therefore this macros can access the width of the diagram. % % These macros should not be used directly in newer code but instead the new % TikZ styles "timing/before text" and "timing/after text". For backward % compatibility these styles default to the two macros. % % {\small % (Deprecated) Example: |\let\texttimingbefore\texttiminggrid| adds a grid into the % background of the \cs{texttiming} diagram.} % % \DescribeMacro\texttiminggrid!\hspace{2.5em}\textbf{Deprecated!}! % This macro should only be used inside \cs{texttimingbefore} or % \cs{texttimingafter} and draws a grid of the full size of the % \cs{texttiming} diagram. % For newer code the TikZ styles "timing/draw grid" and "timing/no grid" % should be used instead, \eg % |\tikzset{timing/intext/.append style={timing/draw grid}}| or simply enable the grid globally % for all in-text and other timing diagrams with |\tikzset{timing/draw grid}|. % % % \newpage % \section{Macro for use inside TikZ-Pictures} % % \DescribeMacro\timing[]~'at'~()~{[]}';' % This macro does the same as \cs{texttiming} but is designed to be used inside % a \envv{tikzpicture} environment and only there. Like normal TikZ macros % (\css{path}, \css{drawn}, \css{node}) it allows an optional argument with TikZ % settings and an optional TikZ-coordinate. However, a own argument parser, not % the one used by TikZ, is used to detect and read these optional arguments. % Therefore the order of the arguments is mandatory and must not be reversed. % This small limitation might be overcome in future versions of this package. % % Please note that the optional initial character may be given \emph{inside} and % at the very start of the mandatory argument, not before it. This is necessary % because of several technical reasons. % % Example: |\tikz \timing [green] at (1,2) {HLZDZLH};|\phantom{\texttt{[L]}} % gives `\tikz \timing [green] at (1,2) {HLZDZLH};'. % % Example: |\tikz \timing [green] at (1,2) {[L]HLZDZLH};| gives `\tikz \timing % [green] at (1,2) {[L]HLZDZLH};'. % % \ifprintversion\else % \clearpage % \fi % \subsection*{Timing Shape Anchors}\label{sec:timingshape} % Every timing diagram line produced by \cs{timing}, which includes the rows in % \env{tikztimingtable}, is also a PGF shape (node) with several anchors. These % are shown in Figure~\ref{fig:shape}. % The shape is very similar to the standard |rectangle| shape but does not % provide a |text| anchor. In addition to the standard points of the compass % anchors of TikZ the three logic levels |low|, |mid| and |high| can be used in % combination with |start|, |mid| and |end|. An extra |origin| anchor is % located at the lower left, also called |south west| corner where the diagram % originates. The two anchors called |start| and |end| are provided to mark the % start and end of the timing signal. There are either located at the low, % middle or high logic level dependent on the used first (or initial) and last % timing character. % % In order to use the timing node it has to be named which can be done using the % `\texttt{name=\meta{name}}' option inside the optional argument. The rows of a % \env{tikztimingtable} are automatically named as `|row|\meta{row number}' % where the first row has the number 1. % % ^^AFurther details how to use a shape inside a TikZ or PGF picture can be % ^^Afound in the PGF manual Section~15 and~59, respectively. % % \begin{figure} % \centering % \resizebox{\textwidth}{!}{%^^A % \begin{tikzpicture}[timing,y=1.5cm,x=1.5cm,timing/slope=0] % \timing [y=1.5cm,x=1.5cm,gray,thick] at (0,0) {HLHLHL}; % \node[name=s,shape=tikztiming@shape,anchor=origin] at (0,0) {}; % \foreach \anchor/\placement in % {north west/above left, north/above, north east/above right, % west/left, center/right, east/right, % mid west/right, mid/left, mid east/left, % base west/left, base/left, base east/above right, % south west/below left, south/below, south east/below right, % low start/below right, mid start/below right, high start/above right, % low mid/above right, high mid/right, % low end/below left, mid end/below left, high end/above left, % start/left, end/right, origin/right} % \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)} % node[\placement] {\tiny\texttt{(s.\anchor)}}; % \end{tikzpicture}%^^A % } % \caption[Timing Shape Anchors]{Timing Shape Anchors. The \texttt{start} and % \texttt{end} anchors mark the start and end of the timing % signal.}\label{fig:shape} % \end{figure} % % % \clearpage % \section{Table for Timing Diagrams} % \begin{DescribeEnv}{tikztimingtable}[]\relax % \MacroArgs {}~~'&'~~[<{\small Init.~Char./TikZ Keys for Row}>] ~~'\\' \\ % \dots\\ % \hspace*{-1em}\Macro\extracode~~'% Optional' \\ % % \end{DescribeEnv} % This environment can be used to typeset multi-line timing diagrams. The % syntax is like the one for a \envv{tabular} environment with two columns. The % first column is for the signal name and the second one are the logic % characters which would be placed inside the argument of a \cs{texttiming} or % \cs{timing} macro. % If the second column starts with an optional argument it is either taken as % initial character if it holds only a single character or as row wide settings % otherwise. % The whole table will be drawn inside a \envv{tikzpicture} environment using % multiple \cs{timing} and \cs{node} macros for the timing signals and their % names, respectively. Additional \pkg{tikz} drawing code can be insert at the % end of the table using \cs{extracode}. % % \DescribeMacro\extracode[TikZ Keys] % This macro is only defined inside a \env{tikztimingtable} environment. In earlier % versions of this package it could only be used after the last table line (\ie after a |\\|). % If used there all code between it and the |\end{tikztimingtable}| will be placed inside the same % \envv{tikzpicture}. This allows to add some drawing lines or a grid to the % picture. The macro does \emph{not} start a TikZ |scope| or a \TeX\ group by itself. % The optional \meta{settings} therefore affect all following code until the end of the picture. % % It is also possible to draw something behind the timing diagram by % using using the \env{background} environment or the PGF background layer:\\[\smallskipamount] % |\begin{pgfonlayer}{background}|\ldots|\end{pgfonlayer}| % % \DescribeMacro\endextracode % From\NewIn{v0.7} version 0.7 on it is possible to add further timing rows after an |extracode| section by using % \cs{endextracode}. Everything after this macro is taken as part of a new row. It is allowed to use % this macro direct before \cs{end}\env{tikztimingtable}. This makes it possible to use \cs{extracode} % anywhere inside the table, including at the very start before any rows are processed. Early % insertion of extra code is necessary for \eg limiting the bounding box or setting up a clipping path. % % \DescribeEnv[]{extracode}[] % Instead\NewIn{v0.7} of using \cs{extracode} \dots \cs{endextracode}, which is actual plain\TeX\ syntax, this % \LaTeX\ style environment can be used. Like any environment it creates a \TeX\ group around its % content, but no TikZ |scope| is created to allow drawing code (\eg clipping paths) to affect the % rest of the table. The optional \meta{settings}, however, only affect the environment content. % % Please note that while \Macro\endextracode is optional if \Macro\extracode is used at the end of the table, % a \Macro\begin{extracode} must always be closed by \Macro\end{extracode}. % % \subsection*{Macros for \cs{extracode} Section} % The following macros are only defined inside a \env{tikztimingtable} after the % macro \cs{extracode}. They are useful for drawing additional material. % % \DescribeMacro\tablegrid*[] % After \css{extracode} this macro draws a grid in the background of the table. % A separate grid is drawn for each row. The normal version draws all grids with % the width of the widest row while the star version draws them with the width % of the corresponding row. Because this macro draws material into the |background| % layer it must not be placed inside a |pgfonlayer| environment itself. % % \DescribeMacro\fulltablegrid[] % After \css{extracode} this macro draws a big grid over all rows in the % background of the table. % % \DescribeMacro\nrows % Returns the number of rows in the current table. Useful for use in % \cs{horlines}. % % \DescribeMacro\rowdist % \DescribeMacro\coldist % This macros return the row and column distance. There are useful for drawing % additional material relative to the rows and columns. This values can be set % (\eg in the optional argument of the table) using the \texttt{timing/rowdist} % and \texttt{timing/coldist} settings which are explained in % Section~\ref{sec:styles}. % % \DescribeMacro\twidth % Returns the width (as multiple of the `period width') of the longest timing % diagram line in the table. Example: If the longest line would be % "H 2.3L z" than \cs{twidth} would be $1+2.3+0.5=3.8$. % % \DescribeMacro\horlines[]{} % Draws horizontal lines, optionally with the given \meta{Settings}, at the base % line of the rows given by \meta{list}. The PGF macro % \css{foreach}\footnote{See the \texttt{pgf} manual for more details.} is % internally used so the list can include not only row numbers as integer but % also fractional numbers and the "..." operator to auto-increment the % numbers. Please note that all numbers in the list are multiplied by % \cs{rowdist}. % If the list is empty the default "1,2,...,\nrows" is used which draws lines % for all rows. % % \DescribeMacro\vertlines[]{} % Like \cs{horlines} but draws vertical lines and the listed numbers a relative % to the basic width. % If the list is empty the default "0,1,...,\twidth" is used which draws lines % after every period width. % % \DescribeMacro\tableheader[]{}{} % This macro adds a table head row on top of the table. The two mandatory % arguments provide the header text for the description and signal columns. % % \DescribeMacro\tablerules[] % This macro adds top and bottom rules to the table in the same (or at least % very similar) way as the \texttt{booktabs} package is doing it for normal % \texttt{tabular}s. The current bounding box is used to calculate the needed % rule length, which makes this macro position dependent if further code % changes the bounding box. If the \cs{tableheader} macro was used beforehand it % also draws a thinner horizontal line (like \texttt{booktabs} \cs{midrule}) % between the table head and body. % % \DescribeEnv[]{background}[] % This environment can be used to draw material on the |background| layer and is % an abbreviation for:\\[\medskipamount] % | \begin{pgfonlayer}{background}|\\ % | \begin{scope}|\oarg{TikZ Keys}\\ % | |\meta{drawing commands}\\ % | \end{scope}|\\ % | \end{pgfonlayer}| % % \subsection*{Scaling the Table} % The standard "scale" setting of TikZ will not scale all parts of the table correctly, % \eg the line width and nodes will keep their original size. However there are scaled % relative to the font size (which needs to be set using \texttt{timing/font}). % If the timing diagrams should be scaled the keys \texttt{timing/unit}, \texttt{timing/xunit} and/or % \texttt{timing/yunit} can be used. % % Alternatively the table can be scaled using the % \cs{scalebox}\marg{factor}\marg{content} macro from the \pkg{graphicx} package or % be placed inside a scaled \cs{node} inside another \env{tikzpicture} environment. % % \subsection*{Positions \& Nodes inside the Table} % % \subsubsection*{Coordinates} % The first row starts at $y=0$ and the next rows are each % |-1*\rowdist| lower than the previous one. % The vertical unit is 1 \textsf{signal height} and the default row distance is % `2' (=$2\times$\textsf{signal height}). This means that a normal table with % three rows goes from $y=+1$ (base line at 0 + 1 \textsf{signal height}) to % $y=-4$ (first row:~+0, second row:~-2, third row:~-4). This are relative to % the middle of the drawn lines, \ie the bounding box is % $2\times\frac{\text{\textsf{line width}}}{2}=1\times $\textsf{line width} % higher. % % The timing column starts at $x=0$ and goes into the positive range while % scaled using the period width. Example: |HHHh| has a width of 3.5. % The label column starts at $x=-$|\coldist| and the text is right align with % the right border at this position. % See Figure~\ref{fig:distnodestable} for an illustration. % % \subsubsection*{Nodes} % Each timing line is a timing node (see section~\ref{sec:timingshape}) % labeled (not fully correctly) as `|row|\meta{number}', where the first row has the number 1 and the last % one the number provided in \cs{nrows}, but can also accessed using the alias "last row". % The corresponding labels are normal rectangle nodes named "label0", "label1", \dots, % `|label|\cs{nrows}'/"last label". % % Both groups of `rows' and `labels' are enclosed in a rectangle node called "all rows" and % "all labels", respectively. These nodes can be used to draw material relative to the rows, % \eg the macros \cs{tableheader} and \cs{tablerules} are making use of them. % The headers added by \cs{tableheader} are rectangle nodes names "label header" and "row header" % and are placed between the x-coordinates of the inner and outer border of "all labels" and "all rows" % respectively. By default the TikZ settings "pos=0" and "anchor=base east"/"anchor=base west", respectively, % are applied to place them in the inner border, but this % can be changed using the styles "timing/table/header" and/or "timing/table/label header"/"timing/table/row header". % All nodes are shown in Figure~\ref{fig:distnodestable}. % % % \begin{figure} % \centering % \scalebox{1.15}{\Huge % \begin{tikztimingtable}[semitransparent] % First Row & H L H L H L \\ % Second Row & H L H L H L \\ % $\vdots$\hspace*{2em} & 3S N[rectangle,above,inner sep=0pt]{$\vdots$} 3S \\ % Last Row & H L H L H L \\ % \begin{extracode} % \tableheader[draw=black,densely dashed,thin]{Label}{Timing} % \tablerules % \useasboundingbox (current bounding box.south west) rectangle (current bounding box.north east); % \begin{background}[black,densely dashed,thin,opacity=1] % \normalsize % \draw (row1.north west) rectangle (row1.south east); % \draw (row2.north west) rectangle (row2.south east); % \draw (last row.north west) rectangle (last row.south east); % \node [right] at (row1.east) {row1}; % \node [right] at (row2.east) {row2}; % \node [right] at (last row.east) {row\cs{nrows}}; % \node [below right] at (last row.east) {last row\large\strut}; % % \path let \p1 = (label header.west), \p2 = (row header.east), \p3 = (all labels.west), \p4 = (all rows.east) in % node [left] at (\x3,\y1) {label header} % node [right] at (\x4,\y2) {row header} % ; % \begin{scope}[solid,semithick,black!80]\tiny % \draw [|->] let \p1 = (label header.south east), \p2 = (all labels.west) in % (\x1+.5\pgflinewidth,\y1-2pt) node [below left=-.4ex] {0} % -- node [below=-.4ex,midway] {pos} (\x2,\y1-2pt) node [below right=-.4ex] {~\rlap{1}} % ; % \draw [|->] let \p1 = (row header.south west), \p2 = (all rows.east) in % (\x1-.5\pgflinewidth,\y1-2pt) node [below right=-.4ex] {0} % -- node [below=-.4ex,midway] {pos} (\x2,\y1-2pt) node [below left=-.4ex] {\llap{1}\,~} % ; % \end{scope} % % \draw [dotted,color=green] (all rows.south west) rectangle (all rows.north east); % \node [below right,green] at (all rows.east) {all rows}; % % \draw (label1.north west) rectangle (label1.south east); % \draw (label2.north west) rectangle (label2.south east); % \draw (last label.north west) rectangle (last label.south east); % \path let \p1 = (label1.west), \p2 = (label2.west), \p3 = (last label.west), \p4 = (all labels.west) in % node [left] at (\x4,\y1) {label1} % node [left] at (\x4,\y2) {label2} % node [left] at (\x4,\y3) {label\cs{nrows}} % node [below left] at (\x4,\y3) {last label\large\strut} % ; % % \draw [dotted,color=green] (all labels.south west) rectangle (all labels.north east); % \node [below left,green] at (all labels.west) {all labels}; % % \begin{scope}[help lines] % \draw (all rows.north west) -- +(0,3.25); % \draw (all rows.north east) -- +(0,3.25); % \draw (all labels.north west) -- +(0,3); % \draw (all labels.north east) -- +(0,3); % \end{scope} % % \begin{scope}[solid,thick] % \draw [fill] (0,0) circle (1pt) node [below right=-2pt] {\tiny origin}; % \draw [>=stealth,->] (-.25,0) -- (.4,0); % \draw [>=stealth,->] (0,-.25) -- (0,.4); % \end{scope} % % \begin{scope}[dotted,gray] % \draw (row1.south west) -- (label1.base west); % \end{scope} % % \begin{scope}[solid] % \draw (row1.north east) -- ++(5em,0) coordinate (O) -- +(5pt,0); % \draw (row1.south east) -- ++(5em,0) coordinate (A) -- +(5pt,0); % \draw (row2.south east) -- ++(5em,0) coordinate (B) -- +(5pt,0); % \draw [<->] (A) -- node[midway,right] {\cs{rowdist}} (B); % \draw [<->] (O) -- node[midway,right] {\cs{yunit}} (A); % % \draw (row1.south east) -- ++(0,1.5) coordinate (A) -- +(0,5pt); % \draw (row1.south east) ++(-1,1) -- ++(0,0.5) coordinate (B) -- +(0,5pt); % \draw [<->] (B) -- (A) node[right] {\cs{xunit}}; % % \draw (row1.north west) -- ++(0,7em) coordinate (A) -- +(0,5pt); % \draw let \p1 = (row1.north west), \p2 = (label1.north east) in % (\x2,\y2) -- (\x2,\y1+7em) coordinate (B) -- +(0,5pt); % \draw [<->] (B) -- (A) node[right] {\cs{coldist}}; % \end{scope} % \end{background} % \end{extracode} % \end{tikztimingtable}%^^A % }%^^A % \caption{Distances and Nodes inside a \env{tikztimingtable}}\label{fig:distnodestable} % \end{figure} % % \clearpage % \section{Macros for use inside the Character String}\label{sec:maccharstr} % The modifiers "@" and `\texttt{\$}' allow the user to include macros. These % macros are evaluated when the |tikz-timing| parser encounters them in the % input character string, \ie before any diagram element is drawn or any single % bracket "[ ]" options are processed. Therefore their values should be set % either outside the |tikz-timing| diagram or with the "[! .. !]" or % "[[ .. ]]" option blocks. % % The following macros are provided for the user. % % \DescribeMacro\tikztimingsetwscale{} % \DescribeMacro\setwscale{} % This macro\NewIn{v0.7}, which can be called |\setwscale| for short inside modifier code, % sets the |wscale| value. This value is used during the parsing process to % scale the width of the characters, \eg |wscale=3.2| makes |1H| as long as % |3.2H| normally would be. Slopes are not affected, but the `width' values of % meta-characters are. It can also be set with the |timing/wscale| TikZ setting. % The current value can be accessed using \cs{wscale}. % % \DescribeMacro\wscale % Returns the current width scaling "wscale" value. % % \DescribeMacro\xunit % \DescribeMacro\yunit % This dimension registers can be used to access the x- and y-unitlength of the timing diagram. % Assignments to these registers do not change the scaling! % % \DescribeMacro\slope % \DescribeMacro\lslope!\hspace{.6em}\small(alias)! % Returns the current logic slope, \ie the slope between |L| and |H| % levels. % Set by the |timing/lslope| or indirectly by the |timing/slope| TikZ setting. % See Table~\ref{tab:styles} for more information. % % \DescribeMacro\zslope % Returns the current Z slope. Set by the |timing/zslope| or indirectly by the % |timing/slope| TikZ setting. % % \DescribeMacro\dslope % Returns the current Z slope. Set by the |timing/dslope| or indirectly by the % |timing/slope| TikZ setting. % % \subsection*{Examples:} % Changing the slope and using its value to calculate the width of a % character:\\ % |\texttiming{ HLHLHL [[timing/slope=.5]] H $\slope$L }|\\ % gives: % {\texttiming{ HLHLHL [[timing/slope=.5]] H $\slope$L }} % \\*[\smallskipamount] % Changing the width scaling for a curtain group of characters:\\* % |\texttiming|\ignorespaces % |{ HL [!wscale=\wscale/3!] 3D{a} Z D Z [!wscale=3*\wscale!] HL }|\\* % gives: % {\texttiming{ HL [!wscale=\wscale/3!] 3D{a} Z D Z [!wscale=3*\wscale!] HL }} % % \clearpage % \section{Meta-Characters} % It is possible to define recurring groups of characters and modifiers as so % called \emph{meta-characters}. These characters are than expanded to the group % whenever they appear inside the character list. Please note that like for % groups a numeric factor before such a meta-character is taken as a repetition % factor not as a width. The meta-character is case sensitive and the other case % is not affected by the definition, \ie the lower- and uppercase versions of % one character can have complete different meanings. It is possible to redefine % normal characters (only one or both cases) as meta-characters, which % suppresses its normal meaning. Using the meta-character in its own definition % group causes a infinite loop which will lead to an \TeX\ error. % % \DescribeMacro\tikztimingmetachar{}[]{} % This macro defines the given \meta{meta-character} to be identical to the % given \meta{character group}. Alternatively this can also be done using the % TikZ style `|timing/metachar=|\marg{Meta-Character}\oarg{Number of % arguments}\marg{Character~Group}'. % % An empty group deletes the meta-character, which might be necessary in cases % when normal characters are temporary redefined as meta-characters. However, if % the group only contains spaces the meta-character is practically ignored. % % Because the meta-character is simply expanded to its character list, the first % character of this list might be combined with identical characters placed before the meta-character. % For example, after a meta-character "Y" got defined as "2D{A} 2D{B}" the characters "DY" will first be expanded to % "D2D{A} 2D{B}" and then combined to "3D{A} 2D{B}". This might not be the wanted behaviour and can be avoided by terminating the leading "D" with % its own braces: "D{}Y". % % \subsection*{Meta-Characters with Arguments} % The\NewIn{v0.7} % replacement text of meta-character can now include macro arguments. % This allows the creation of more complex and flexible meta-characters. The % optional argument \meta{Number of arguments} selects the number of macro % arguments in the same way it does for \cs{newcommand}. However, the first % argument |#1| is always set to the given `width' of the meta-character, \ie % the number value preceding it. All further arguments are read as normal for % macros from the text after the meta-character. It is recommended to enclose % them in braces. % % The default behaviour of meta-character without arguments is, as mentioned % above, to repeat the replacement group by the preceding number (`width'). This % is now archived by defining them internally as `|#1|\marg{Character Group}', % which creates a repetition group. Users which want to include an own argument % but still want to repeat the group need to define a meta-character with at % least two arguments and define it as "#1{ .. #2 .. }". If the repetition is % not wanted the |#1| argument can be used as a real width for one or more group % internal characters: "{Y}[1]{Z #1D Z}", so "4Y" will give "Z 4D Z" % instead of "4{Z D Z}". % % Also the modifier "@" (see Table~\ref{tab:modifiers}) together with the % \cs{setwscale} macro can be used to scale the whole group dependent on the % first argument:\\ % "{Y}[1]{ @{\setwscale{#1*\wscale}} Z 2D Z @{\setwscale{\wscale/#1}} }", so % "4Y" is equivalent to "4Z 8D 4Z". % % The new `\texttt{\$}' modifier can be used to calculate the width of the group % characters: |{Y}[1]{$#1/3$D{A} $#1/3$D{B} $#1/3$D{C}}|, so "4Y" results in % "1.333D{A} 1.333D{B} 1.333D{C}". % % % \bigskip % \noindent % \textit{Examples:}\\*[\medskipamount] % |\tikztimingmetachar{Y}{2D 0.5U 2D{}} \texttiming{ZZ Y Z 3Y ZZ}|\\ % gives: % {\tikztimingmetachar{Y}{2D 0.5U 2D{}} \texttiming{ZZ Y Z 3Y ZZ}} % \\[\bigskipamount] % |\tikztimingmetachar{Y}{2D{Text}} \tikztimingmetachar{y}{1D{\tiny Text}}| % |\texttiming{ZZ Y Z 3y ZZ}|\\ % gives: % {\tikztimingmetachar{Y}{2D{Text}} \tikztimingmetachar{y}{1D{\tiny Text}} % \texttiming{ZZ Y Z 3y ZZ}} % \\[\bigskipamount] % \DeleteShortVerb{\|} % \MakeShortVerb{\`} % `\newcounter{mycount}`\\ % `\tikztimingmetachar{Q}{2D{\stepcounter{mycount}\arabic{mycount}}}`\\ % `\tikztimingmetachar{R}{[| /utils/exec=\setcounter{mycount}{0} |]}`\\ % `\texttiming{ 5Q R 3Q R 10Q }`\\ % gives: % {\newcounter{mycount}% % \tikztimingmetachar{Q}{2D{\stepcounter{mycount}\arabic{mycount}}}% % \tikztimingmetachar{R}{[| /utils/exec=\setcounter{mycount}{0} |]}% % \texttiming{ 5Q R 3Q R 10Q }} % \DeleteShortVerb{\`} % \MakeShortVerb{\|} % \\[\bigskipamount] % Redefining the glitch "G" character:\\ % |\tikztimingmetachar{G}{.1T.1T .2B} \tikztimingmetachar{g}{.1T.1T}|\\ % |\texttiming{ 10{H G L G} H } % With correction of width `.2B'|\\ % |\texttiming{ 10{H g L g} H } % Without correction|\\ % |\texttiming{ 10{H L } H } % For comparison|\\ % gives:\\ % {\let\texttimingbefore\texttiminggrid % \tikztimingmetachar{G}{.1T.1T .2B} \tikztimingmetachar{g}{.1T.1T}% % \texttiming{ 10{H G L G} H }\\ % \texttiming{ 10{H g L g} H }\\ % \texttiming{ 10{H L } H }} % \\[\bigskipamount] % |\tikztimingmetachar{J}[2]{ 1.8D{#2} .2D{} }|\\ % |\texttiming{ D{} J{A} J{B} J{C} D }|\\ % gives: % {\tikztimingmetachar{J}[2]{ 1.8D{\strut #2} .2D{} }% % \texttiming{ D{} J{A} J{B} J{C} D }} % \\[\bigskipamount] % |\tikztimingmetachar{Y}[3]{#1{ D{\strut #2} D{#3} }}|\\ % |\texttiming{ Z 2Y{a}{b} Z 4Y{1}{2} Z}|\\ % gives: % {\tikztimingmetachar{Y}[3]{#1{ D{#2} D{#3} }}% % \texttiming{ Z 2Y{a}{b} Z 4Y{1}{2} Z}} % \\[\bigskipamount] % |\tikztimingmetachar{Y}[3]{ .2D .2B #1d{\strut #2} .2D .2B #1d{\strut #3} }|\\ % |\texttiming{ Z 2Y{a}{b} Z 4Y{1}{2} Z}|\\ % gives: % {\tikztimingmetachar{Y}[3]{ .2D .2B #1d{\strut #2} .2D .2B #1d{\strut #3} }% % \texttiming{ Z 2Y{a}{b} Z 4Y{1}{2} Z}} % \\[\bigskipamount] % Mata-chars to set the width scaling. Because the scaling also affects the % meta-char width (|#1|) argument a compensation is needed to achieve absolute % values (|W|) instead of relative ones (|w|).\\ % |\tikztimingmetachar{w}[1]{ [! wscale=#1 !] } % relative|\\ % |\tikztimingmetachar{W}[1]{ [! wscale=#1/\wscale !] } % absolute|\\ % |\texttiming{ HL .2w HLHLH 3w LH 1W LH }|\\ % gives: % {\tikztimingmetachar{w}[1]{ [! wscale=#1 !] }% % \tikztimingmetachar{W}[1]{ [! wscale=#1/\wscale !] }\\ % \texttiming{ HL .2w HLHLH 3w LH 1W LH }} % % \clearpage % \section{Floating timing diagrams with captions} % The timing diagrams can also be typeset as floats with (or without) a caption like a |figure|. % This can be easily achieved by using the \pkg{caption} package as shown in the following example document. % % \par\vspace{3\baselineskip}\par % % \begin{lstlisting}[gobble=4,language={[latex]tex},frame=single] % \documentclass{article} % \usepackage{tikz-timing} % \usepackage{caption} % % \DeclareCaptionType{timingdiag}[Timing diagram][List of Timing Diagrams] % % \begin{document} % \listoftimingdiags % % \begin{timingdiag}[!ht] % \centering % (timing code) % \caption{Some timing diagram caption} % \label{tim:foobar} % \end{timingdiag} % % \end{document} % \end{lstlisting} % % % \chapter{TikZ Keys for Styles, Settings and Actions}\label{sec:styles} % TikZ itself uses the |pgfkeys| package to define and apply drawing styles and settings. % The same method is also used for |tikz-timing| which % places all of the keys under the ``subdirectory'' "timing" in % the main ``directory'' `tikz', which is the default when \css{tikzset} is % used. % This keys are simply called \emph{TikZ Keys} throughout this manual and % can be used in all places where \meta{TikZ Keys} is mentioned, while some only make sense at specific % places. % Three types of keys % are used by this package: styles, settings and actions. % % Styles simply define the style in which a certain element is drawn, \eg in which color or line width. % This styles are defined and can be redefined using % \css{tikzset}|{|\meta{style name}|/.style=|\meta{value}|}|. However, while some styles % are initial empty, some hold internal settings and therefore user styles should only be added % using `|.append style=|\meta{value}'. % % Settings are TikZ keys which await an argument and set an internal macro or length. They are % like \cs{setlength} and \cs{renewcommand}. They should only by used as stated and not be redefined like styles as % shown above. % % Action are TikZ keys which perform a drawing or other action on the current element, either directly or % by en-/disable an internal setting which then in turn triggers the drawing process. Therefore some % actions can be globally and/or locally but others only make sense if used locally on a single |tikz-timing| % macro or environment or even a scope inside a \env{tikztimingtable}. % Action can be very similar to settings but they always execute code instead of only setting/redefining it. % The actions are defined and can be redefined using % \css{tikzset}|{|\meta{action name}|/.code=|\meta{code}|}|% % % \begingroup % \def\C{Action} % \def\S{Style} % \def\s{Setting} % \def\en{\,\textsf{--}\,} % % \section*{General} % \begin{tabularx}{\textwidth}{>{\ttfamily}ll>{\raggedright\arraybackslash}X} % \toprule % \normalfont TikZ Key & Type & Description \\ % \midrule % timing & \S & Base settings like signal height and period width.\\ % timing/font=\meta{font commands} & \s & Sets the normal \texttt{font} key and sets \texttt{x}/\texttt{y} keys to 1.6ex.\\ % timing/intext & \S & Used for \cs{texttiming}. Depends on \texttt{timing}.\\ % timing/picture & \S & Usable for own \texttt{tikzpictures} to set timing settings.\\ % timing/inline node & \S & Used for nodes created by the \texttt{N} character. Defaults to \texttt{coordinate}.\\ % timing/every char & \S & Used in the \cs{draw} TikZ command for every drawn timing character.\\ % timing/every bg & \S & Used for every background path of characters like \texttt{D}.\\ % timing/text format=\meta{code} & \s & Sets formatting code for the text of characters like \texttt{D}. The code is placed directly for the text wrapped in braces, so that the code can be a macro awaiting the text as an argument. By default the code is empty.\\ % \midrule % timing/initchar=\meta{char} & \s & Sets initial character. Only valid as first optional argument in table rows or in \cs{texttiming}.\\ % \midrule % timing/metachar=\marg{C}\oarg{\#arg}\marg{G}& \s& Sets meta-character \meta{C} to character group \meta{G}.\\ % \midrule % timing/before & \C & Code executed direct before the timing TikZ code inside the internal % \cs{tikzpicture}. \\ % timing/after & \C & Code executed direct after the timing TikZ code inside the internal % \cs{tikzpicture}.\\ % \bottomrule % \end{tabularx} % % \section*{Scaling} % \begin{tabularx}{\textwidth}{>{\ttfamily}ll>{\raggedright\arraybackslash}X} % \toprule % \normalfont TikZ Key & Type & Description \\ % \midrule % timing/unit=\meta{length expression} & \s & Sets both the x- and y-unitlength. \\ % timing/xunit=\meta{length expression} & \s & Sets the x-unitlength (\texttt{\textbackslash xunit}) for the timing diagrams. \\ % timing/yunit=\meta{length expression} & \s & Sets the y-unitlength (\texttt{\textbackslash yunit}) for the timing diagrams. \\ % timing/font=\meta{code} & \s & Can be used to set font macros. Needs to be used instead of the normal TikZ \texttt{font} as it resets \texttt{unit} % etc.\ if it is font sized dependent.\\ % timing/wscale=\meta{math expression} & \s & Sets the width-scale \texttt{\textbackslash wscale} by calling \texttt{\textbackslash tikztimingsetwscale}. See section~\ref{sec:maccharstr} for further details. \\ % \bottomrule % \end{tabularx} % % \section*{Slopes} % \begin{tabularx}{\textwidth}{>{\ttfamily}ll>{\raggedright\arraybackslash}X} % \toprule % \normalfont TikZ Key & Type & Description \\ % \midrule % timing/slope=\meta{0.0\en1.0} & \s & Sets slope for logic transitions. \newline This also sets \texttt{dslope=2*slope}, \texttt{zslope=slope/2}.\\ % timing/lslope=\meta{0.0\en1.0} & \s & Sets slope for logic transitions only. Default: 0.1\\ % timing/dslope=\meta{0.0\en1.0} & \s & Sets slope for data transitions. Default: 0.2\\ % timing/zslope=\meta{0.0\en1.0} & \s & Sets slope for Z transitions. Default: 0.05\\ % \bottomrule % \end{tabularx} % % \section*{Texttiming} % \begin{tabularx}{\textwidth}{>{\ttfamily}ll>{\raggedright\arraybackslash}X} % \toprule % \normalfont TikZ Key & Type & Description \\ % \midrule % timing/outer sep=\meta{dim} & \s & Sets outer separation around \cs{texttiming} macros. \\ % timing/outer xsep=\meta{dim} & \s & See above. Only X-Coordinate. (Default:~0pt) \\ % timing/outer ysep=\meta{dim} & \s & See above. Only Y-Coordinate. (Default:~0pt) \\ % \midrule % timing/before text & \C & Code executed direct before the timing TikZ code inside the internal % \cs{tikzpicture} for \cs{texttiming}. This code is executed just after the \texttt{timing/before} code. Defaults % to \cs{texttimingbefore}.\\ % timing/after text & \C & Code executed direct after the timing TikZ code inside the internal % \cs{tikzpicture}. This code is executed just before the \texttt{timing/after} code. Defaults to % \cs{texttimingafter}.\\ % \bottomrule % \end{tabularx} % % \section*{Grid} % \begin{tabularx}{\textwidth}{>{\ttfamily}ll>{\raggedright\arraybackslash}X} % \toprule % \normalfont TikZ Key & Type & Description \\ % \midrule % timing/grid & \S & Style used for drawing grids. Depends on \texttt{help lines} and \texttt{timing}. \\ % timing/draw grid & \C & Enables background grids for \cs{timing} macros. \\ % timing/no grid & \C & Disabled background grids for \cs{timing} macros. \\ % \bottomrule % \end{tabularx} % % \section*{Table} % \begin{tabularx}{\textwidth}{>{\ttfamily}ll>{\raggedright\arraybackslash}X} % \toprule % \normalfont TikZ Key & Type & Description \\ % \midrule % timing/name & \S & Used for the signal name column in \env{tikztimingtable}.\\ % timing/table & \S & Used for \env{tikztimingtable}. Depends on \texttt{timing}.\\ % timing/table/grid & \S & Used for table grid. Depends on \texttt{timing/grid}.\\ % timing/table/lines & \S & Used for \cs{horlines} and \cs{vertlines}. \\ % timing/table/rules & \S & Used for \cs{tablerules} for top and bottom lines. \\ % timing/table/midrules & \S & Used for \cs{tablerules} between table head and body. \\ % timing/table/header & \S & Used for \cs{tableheader}. Defaults to \texttt{timing/name}.\\ % timing/table/label header & \S & Used for label header in \cs{tableheader}. \\ % timing/table/row header & \S & Used for timing row header in \cs{tableheader}. \\ % \midrule % timing/rowdist=\meta{distance} & \s & Sets (baseline) distance between rows in a tikztimingtable. Default: 2 (=$2\times$signal height)\\ % timing/coldist=\meta{distance} & \s & Sets distance between columns in a tikztimingtable. Default: 1 (=$1\times$period width)\\ % \midrule % timing/before table & \C & Code placed before the tables TikZ code inside the internal % \texttt{tikzpicture}.\\ % timing/after table & \C & Code placed after the tables TikZ code at the end of the % internal \texttt{tikzpicture}.\\ % \bottomrule % \end{tabularx} % % \section*{Character Styles} % \begin{tabularx}{\textwidth}{>{\ttfamily}ll>{\raggedright\arraybackslash}X} % \toprule % \normalfont TikZ Key & Type & Description \\ % \midrule % timing/\meta{lowercase char} & \s & Style for character \meta{char}. Not used for `\texttt{H}' and `\texttt{L}'. \\ % timing/\meta{lc char}/background & \s & Background style for characters `\texttt{D}' and `\texttt{U}'. \\ % timing/\meta{lc char}/text & \s & Text style for character \meta{char}. Only defined for `\texttt{D}'. \\ % \midrule % timing/text format=\meta{macros} & \s & Define macros which are placed before the text of `\texttt{D\{text\}}'. The text is enclosed in braces to % allow the last macro to take it as an argument. A \cs{strut} is a good choice to ensure a common baseline.\\ % \bottomrule % \end{tabularx} % % \section*{Debug} % Some debug settings for users (first group) and the package developer (last group). % % \medskip\noindent % \begin{tabularx}{\textwidth}{>{\ttfamily}ll>{\raggedright\arraybackslash}X} % \toprule % \normalfont TikZ Key & Type & Description \\ % \midrule % timing/debug/nodes & \C & Enables marking of named inline nodes. \\ % timing/debug/node & \S & Format style for inline node marker label, which itself is a TikZ node. \\ % timing/debug/markcmd=\meta{code} & \s & TikZ drawing code to draw marker (except label). The code can access the node name as \cs{N}. \\ % timing/debug/scope & \S & Format for scope of node markers. \\ % \midrule % timing/debug/level=\meta{integer} & \s & Sets debug output level. This is only important for developers. \\ % \bottomrule % \end{tabularx} % % \section*{Other} % \begin{tabularx}{\textwidth}{>{\ttfamily}ll>{\raggedright\arraybackslash}X} % \toprule % \normalfont TikZ Key & Type & Description \\ % \midrule % timing/expand count=\meta{integer} & \s & Sets the maximum expand count for the underlying % \texttt{tikzpicture}. TikZ only expands the content this number of times. The TikZ default value % of 100 is to small for timing diagrams and is changed to 1000 by default. This should be raised % (only) if TikZ throws an to-many-expands error.\\ % \bottomrule % \end{tabularx} % % \endgroup % % \clearpage % \chapter{Libraries for Further Characters} % All default timing characters described in Table~\ref{tab:chars} are always % made available by this package. Further, less-common characters are provided % by libraries which are loaded with the macro % \cs{usetikztiminglibrary}\marg{library}. This is done to hold the memory % usage of this package small and reduce the risk of collisions with % user-defined (meta-)characters. % The full syntax for the above macro is % \cs{usetikztiminglibrary}\oarg{options}\marg{library,\dots}\oarg{date}, like % the one for \cs{usepackage}. % The date is used as a version number like for packages and is identical to the date % of the |tikztiming| package. % % \clearpage % \library{arrows}{Arrows} % The library "arrows" enables two characters "A" and "W" which draw % vertical up and down \textit{A}rro\!\textit{W}s. Such arrows are used in % timing diagrams to mark special polarized events, like clock edges of another % signal. % % The width provided with these character is added as whitespace after the % ``zero-width'' arrow: "A2AA" results in `\texttiming{A2AA}'. This space % can be avoided by specifying the width to zero: "0A". Like the "C" and % "T" characters the subsequent arrow characters are not combined into one. % % The arrow tips can be changed using the TikZ styles for this characters. See % section~\ref{sec:styles} for more information. The "A" and "W" character should % only be used which each each other, but not together with any other characters % except with "S" (space). % % \begin{table}[H] % \centering % \caption{Examples for Arrow Characters.}\label{tab:arrows} % \begin{tikztimingexampletable} % 0A \\ % AAA \\ % 3A \\ % 3{A} \\ % 3A 3A \\ % 3a 3a \\ % AW AW \\ % 3{AW} \\ % 3{aw} \\ % 2S 2A 3W A W \\ % \extracode % \tablegrid* % \end{tikztimingexampletable} % \end{table} % % \clearpage % \library{either}{Either High or Low} % The library "either" enables the "E" character which stands for % `\textit{either high or low}'. This character is designed to be used with the % "H" and "L" characters to display a uncertainty of a transition. % Sometimes a, e.g.\ low signal can go either to high or stay at low for a % certain time before it definitely goes to high. In this case both (or more) % possible transitions can be drawn using this character. % Like the "C" and "T" characters subsequent "E" characters are not % combined into one. % % The drawing style can be changed using the |timing/e| and % |timing/e/background| TikZ style. % % \begin{table}[H] % \centering % \caption{Examples for the `\texttt{E}' Character.}\label{tab:either} % \begin{tikztimingexampletable}[timing/e/background/.style={fill=black!20}] % L E H \\ % L D H \\ % H E L \\ % H D L \\ % L E E H \\ % L 3{.25E} H \\ % H E E L \\ % L EEE HH EEE L \\ % l e e h \\ % h e e l \\ % H 2E L \\ % H 2{E} L \\ % H 5{e} L \\ % H E E H \\ % L E E L \\ % \end{tikztimingexampletable} % \par\medskip % \makebox[\textwidth][c]{% % \begin{tabular}{lc} % \toprule % Settings (\texttt{timing/e/.cd}) & Resulting Diagram (\texttt{LL EE HH}) \\ % \midrule % \texttt{.style=\{dotted,gray\}} & \texttiming[timing/e/.style={dotted,gray}]{LL EE HH} \\ % \texttt{background/.style=\{fill=gray\}} & \texttiming[timing/e/background/.style={fill=gray}]{LL EE HH} \\ % \bottomrule % \end{tabular} % }% % \end{table} % % \clearpage % \library{overlays}{Overlays} % The library "overlays" enables the "O" character which allows the % overlaying of timing characters, i.e.~different groups of timing characters % are drawn on top of each other. This is not to be confused with `dynamic' overlay % provided by the presentation class |beamer|. The |tikz-timing| library \lib{beamer} provides % some support for such overlays. % % The "O" character awaits a set of character % enclosed by braces which are drawn as normal. The position before the "O" % character is then restored and the following characters are drawn over them. % Older versions of this character awaited a second set of characters in braces % but this braces are now optional. The exact syntax is:\\[\smallskipamount] % \hspace*{2em} \meta{chars before} |O|\marg{background chars} \marg{foreground % chars} \meta{chars after}\\[\smallskipamount] % or, without second set of braces, but equal:\\[\smallskipamount] % \hspace*{2em} \meta{chars before} |O|\marg{background chars} \meta{foreground % chars, \dots}\\[\smallskipamount] % % It is the responsibility of the user to make sure that the lines drawn by the % first set reconnect to the main lines or do something else useful. The % modifier ";" can be used to restart the drawn line, e.g.\ to change to a % different color. This is not done automatically to give the user the freedom % if and where this should happen. It is recommended to start and end the set % with characters identical with the main line to avoid ugly connection points. % % Please note that the width of the first argument is ignored and does not count to the % total width of the diagram line. The characters following the overlay should therefore % be as wide or wider as the one of the overlay, otherwise the bounding box and background grid % will be incorrect. % % Overlays can be cascaded\NewIn{v0.7}, \ie an overlay can be included in the first argument % of another overlay. % % \begin{table}[H] % \centering % \caption{Examples for the `\texttt{O}' Overlay Character.}\label{tab:overlays} % \ifprintversion % \begin{tikztimingexampletable}[timing/draw grid] % LLL O{HH}{LL} HHH \\ % LLL O{HHH}{LL} HHH \\ % LLL O{;[gray]HH.1H;}{LLH} HH \\ % LL O{L;[gray]HH.1H;}{LLLH} HH \\ % DD{} O{zd}{D}d 2D \\ % ZZ O{Z D Z}{Z 1.1M .9Z} ZZ \\ % ZZ O{d Z}O{DZ}{dD} ZZ \\ % ZZ O{dDZ}O{DZ}{dZ} ZZ \\ % ZZ 3D O{dDZ}{DZ} ZZ \\ % ZZ 3D O{dDZ}O{DZ}{dZ} ZZ \\ % ZZ 3D O{3D} DZZ \\ % Z O{DD} ZDDD O{DDZZ} DZ 2S \\ % Z O{6D Z}{Z 4D Z} Z \\ % Z O{8D Z}O{Z 6D Z}{2Z 4D 2Z} Z \\ % \end{tikztimingexampletable} % \else % \begin{tikztimingexampletable}[timing/draw grid] % LLL O{HH}{LL} HHH \\ % LLL O{HHH}{LL} HHH \\ % LLL O{;[gray]HH.1H;}{LLH} HH \\ % LL O{L;[gray]HH.1H;}{LLLH} HH \\ % DD{} O{zd}{D}d 2D \\ % ZZ O{Z D Z}{Z 1.1M .9Z} ZZ \\ % ZZ O{d Z}O{DZ}{dD} ZZ \\ % \end{tikztimingexampletable} % \begin{tikztimingexampletable}[timing/draw grid] % ZZ O{dDZ}O{DZ}{dZ} ZZ \\ % ZZ 3D O{dDZ}{DZ} ZZ \\ % ZZ 3D O{dDZ}O{DZ}{dZ} ZZ \\ % ZZ 3D O{3D} DZZ \\ % Z O{DD} ZDDD O{DDZZ} DZ 2S \\ % Z O{6D Z}{Z 4D Z} Z \\ % Z O{8D Z}O{Z 6D Z}{2Z 4D 2Z} Z \\ % \end{tikztimingexampletable} % \fi % \end{table} % % \clearpage % \library{clockarrows}{Clock Arrows} % The library "clockarrows"\NewIn{v0.7} is changing the "C" clock character to contain % arrows which mark the rising and/or falling clock edge. By default the rising % edges are marked. To simplify the implementation only the transition from a % "C" to another "C" character contains the arrows but not transitions from % or to different characters, like "HCH" or "LCL". % % The arrows can be controlled using the TikZ styles shown in % Table~\ref{tab:clockarrowstyles} below. This styles can also be used as % library options. The key ``directory'' "timing/c" must be dropped for % options, e.g.\\\hspace*{2em} % \cs{usetikztiminglibrary}|[rising arrows]{clockarrows}|. % \begin{table}[H] % \centering % \caption{TikZ Styles for Clock Arrows.} % \label{tab:clockarrowstyles} % \makebox[\textwidth][c]{% % \begin{tabularx}{1\textwidth}{>{\ttfamily}l>{\raggedright\arraybackslash}X} % \toprule % \normalfont TikZ Style & Description \\ % \midrule % timing/c/rising arrows & Mark (only) rising edges with arrows.\\ % timing/c/falling arrows & Mark (only) falling edges with arrows.\\ % timing/c/dual arrows & Mark both rising and falling edges with arrows.\\ % timing/c/no arrows & Do not mark any edges with arrows. (Default)\\ % \midrule % timing/c/arrow & Style for arrows. Can be modified to change arrow tip etc. (Default: \{\})\\ % timing/c/arrow pos=\meta{0.\!-\!\!-1.} & Position of arrows, i.e.\ its tip, on the edge. % May needs adjustment if different arrow tip shapes are selected. (Default: 0.95)\\ % timing/c/arrow tip=\meta{name} & Tip shape of arrows. See the PGF manual for the list of arrow tips. (Default: `\texttt{to}')\\ % \bottomrule % \end{tabularx}} % \end{table} % % \begin{table}[H] % \caption{Examples for the Clock Arrows.}\label{tab:clockarrows} % \tikzset{timing/c/dual arrows}% % \centering % \ifprintversion % \begin{tabular}{lc} % \toprule % Settings (\texttt{timing/c/.cd}) & Resulting Diagram (\texttt{11\{C\}}) \\ % \midrule % \texttt{rising arrows} & \texttiming[timing/c/rising arrows]{10{C}} \\ % \texttt{falling arrows} & \texttiming[timing/c/falling arrows]{10{C}} \\ % \texttt{no arrows} & \texttiming[timing/c/no arrows]{10{C}} \\ % \texttt{dual arrows} & \texttiming[timing/c/dual arrows]{10{C}} \\ % \midrule % \texttt{arrow pos=.5} & \texttiming[timing/c/arrow pos=.5]{10{C}} \\ % \texttt{arrow tip=latex} & \texttiming[timing/c/arrow tip=latex]{10{C}} \\ % \texttt{arrow tip=stealth} & \texttiming[timing/c/arrow tip=stealth]{10{C}} \\ % \bottomrule % \end{tabular} % \else % \begin{minipage}[t]{.49\textwidth} % \vspace{0pt}\centering % \begin{tabular}{lc} % \toprule % Settings (\texttt{timing/c/.cd}) & Resulting Diagram (\texttt{11\{C\}}) \\ % \midrule % \texttt{rising arrows} & \texttiming[timing/c/rising arrows]{10{C}} \\ % \texttt{falling arrows} & \texttiming[timing/c/falling arrows]{10{C}} \\ % \texttt{no arrows} & \texttiming[timing/c/no arrows]{10{C}} \\ % \texttt{dual arrows} & \texttiming[timing/c/dual arrows]{10{C}} \\ % \bottomrule % \end{tabular} % \end{minipage} % \hfill % \begin{minipage}[t]{.49\textwidth} % \vspace{0pt}\centering % \begin{tabular}{lc} % \toprule % Settings (\texttt{timing/c/.cd}) & Resulting Diagram (\texttt{11\{C\}}) \\ % \midrule % \texttt{arrow pos=.7} & \texttiming[timing/c/arrow pos=.7]{10{C}} \\ % \texttt{arrow pos=.4} & \texttiming[timing/c/arrow pos=.4]{10{C}} \\ % \texttt{arrow tip=latex} & \texttiming[timing/c/arrow tip=latex]{10{C}} \\ % \texttt{arrow tip=stealth} & \texttiming[timing/c/arrow tip=stealth]{10{C}} \\ % \bottomrule % \end{tabular} % \fi % \end{minipage} % \end{table} % % \clearpage % \library{columntype}{Column Type} % The library "columntype"\NewIn{v0.7} uses the \pkg{array} package to define a new % |tabular| column type for timing characters. The tabular column can then hold % timing characters like the \env{tikztimingtable}. An initial option block % "[...]" is taken as initial character or diagram line wide settings. The % main difference between these two table types is that \env{tikztimingtable} % creates a big common |tikzpicture| with one coordinate system with potential % extra drawing code and the column type creates single pictures for each % diagram line without common coordinate system. % % By default the letter "T" and left alignment are used for the timing column % type. The TikZ style |timing/columntype=|\marg{letter}\marg{alignment} can be % used to select different column letters and alignments. The \meta{alignment} % represents here the \emph{real} column letter like "l", "c" or "r". % Additional column code can be added using the `|>|\marg{code}' and % `|<|\marg{code}' argument of the \pkg{array} package. % \iffalse % \noindent\textbf{Examples:}\\ % \hspace*{1em}|\tikzset{timing/columntype={T}{r}}| \hspace{2em} Change to right % alignment.\\ % \hspace*{1em}|\tikzset{timing/columntype={I}{>{code}c<{code}}| \hspace{2em} % Defines letter "I" to create centered timing diagrams with some code before % and after it. % \fi % % More complex column types (\eg one holding |@{..}| or |!{..}| arguments, % multiple columns, etc.) must be defined manually using \pkg{array}'s % \cs{newcolumntype} macro. The default definition is equal % to\\[\smallskipamount] % \hspace*{2em}|\newcolumntype{T}{>{\celltiming}l<{\endcelltiming}}|. % % \smallskip % The default "T" definition can be suppressed by using either the library % option |notype| or a different |type| (equal to |timing/columntype|): % \\[\smallskipamount] % \hspace*{2em}|\usetikzlibrary[type={U}{l}]{columntype}|\\[\smallskipamount] % % \bigskip % \begin{figure} % \makeatletter % \let\tikztiming@embedexample\empty % \makeatother % \centering % \begin{examplecode} % \begin{tabular}{lcT} % \toprule % Description & Num & \multicolumn{1}{l}{Signal} \\ % \midrule % Example & A & HLHZLHL \\ % Example & B & [][green] HLHZLHL \\ % Example & C & [green] HLHZLHL \\ % \bottomrule % \end{tabular} % \end{examplecode} % \caption{Example for use of Timing Column Type.}\label{exa:columntype} % \end{figure} % % \clearpage % \library{nicetabs}{Nice Timing Tables} % The library "nicetabs"\NewIn{v0.7} uses the settings of the \pkg{array} and % \pkg{booktabs} packages to improve the layout of \env{tikztimingtables}. The % resulting table matches a \env{tabular}|{rT}| table which uses the above % packages and the |columntype| library. The table macros \cs{tabcolsep}, % \cs{arraystretch} and \cs{extrarowheight} are obeyed. % % The original table layout is designed to produce integer coordinates between % the rows to simplify the drawing of extra drawings (see \cs{extracode}). The % improved layout will cause non-integer coordinates, but in-line nodes and the % \cs{rowdist} and \cs{coldist} macros can be used to draw extra material % relatively to the rows. % % The TikZ styles "timing/nice tabs" (default) and "timing/no nice tabs" can % be used to activate and deactivate the layout, \eg for each table. Both % settings can be given as a library option, but without the "timing/" path. % % \bigskip % \begin{table}[H] % \caption{Timing tables using `nice' (left) and normal (right) Layout. For % comparison a \texttt{\{tabular\}\{rT\}} table is placed in grey below the % left table.}^^A % \hbox{}\hfill % \begin{tikzpicture} % \node [gray] {\sffamily\ignorespaces % \begin{tabular}{rT} % \toprule % Name & \multicolumn{1}{l}{Timing} \\ % \midrule % Example & HLHLLHHH \\ % Example & HLHLLHHH \\ % Example & HLHLLHHH \\ % \bottomrule % \end{tabular}^^A % }; % \node {\ignorespaces % \begin{tikztimingtable}[timing/nice tabs] % Example & HLHLLHHH \\ % Example & HLHLLHHH \\ % Example & HLHLLHHH \\ % \extracode % \tableheader{Name}{Timing} % \tablerules % \end{tikztimingtable}^^A % }; % \end{tikzpicture} % \hfill % \begin{tikztimingtable}[timing/no nice tabs] % Example & HLHLLHHH \\ % Example & HLHLLHHH \\ % Example & HLHLLHHH \\ % \extracode % \tableheader{Name}{Timing} % \tablerules % \end{tikztimingtable} % \hfill\hbox{}^^A % \end{table} % % \clearpage % \library{counters}{Counter Character} % The library "counters"\NewIn{v0.7}\ExtIn{v0.7a} allows the easy definition % of meta-characters which % implement up-counters. These characters show the counter value using the % "D{}" character and increment it by one every time they are used. A second % character can be defined to (re-)set the counter to a specific value. The % counter values can be decimal (base-10, default), hexadecimal (base-16) or any % other base from 2 to 36. By default the lower case version of the counter % character is defined to produce the same output only with half the width. % % Counter characters are defined using the TikZ key % `\texttt{timing/counter/new=}\linebreak[3]\ignorespaces % \texttt{\{char=\meta{char},\meta{settings}\}}' which can also be written as % "timing/new counter". The \meta{settings} are TikZ keys themselves and are % shown by Table~\ref{tab:countersettings}. One or more "new" keys (path % "timing/counter" removed) can be given as library options. % The counter values are global like normal \LaTeX\ counters. They should be reset % in every timing diagram line before they are used. % % \subsubsection*{Counter Style} % The styles `\texttt{timing/counter/\meta{char}}' and `\texttt{timing/counter/\meta{char}/text}' % (both initially empty) are used to format the graphic and text style of this counter, respectively. % Because the "D{}" character is used internally the above styles need to change the corresponding % "D" styles. This changes are only local and do not affect further `real' "D" characters. % % The settings "fg style", "bg style" and "text style" can be used to quickly define the % foreground (\ie line), background and text style of the counter. While the "text style" setting % simple sets the `\texttt{timing/counter/\meta{char}/text}' style, the other two are a shortcut for % \\*[\smallskipamount] % | \tikzset{timing/counter/|\meta{char}|/.style={%|\\ % | timing/d/.style=|\marg{fg style}|,|\\ % | timing/d/background/.style=|\marg{bg style}|,|\\ % | }}|\\ % \par\medskip % % \subsubsection*{Additional Macros} % \DescribeMacro\tikztimingcounter{} % \DescribeMacro\tikztimingsetcounter{}{} % The value of counter \meta{char} can be read or set using this macros. % % \begin{table} % \caption{Settings for Counter Meta-Characters} % \label{tab:countersettings} % \makebox[\textwidth][c]{% % \begin{tabularx}{1\textwidth}{>{\ttfamily}lX} % \toprule % \multicolumn{1}{l}{Key name} & Description \\ % \midrule % char=\meta{char} & Defines the given \meta{char} to be a counter % meta-character. If it is a upper case character the lower case character % will produce the same output but with the half width, as long this is not % overwritten with the \texttt{half with char} key. \\ % half width char=\meta{char} & Defines the given \meta{char} to be the half % width version of the counter value. By default this is the lower case % version of the counter character given with \texttt{char}. An empty value % for \meta{char} deactivates the definition of a half width character.\\ % reset char=\meta{char} % & Defines the given \meta{char} to (re-)set the counter value to the `width' % of the character, \ie the number preceding it. The lower case version of % the reset \meta{char} is not defined.\\ % reset type=\small\meta{width\Pipe arg\Pipe both\Pipe Both} % & Defines the type of the reset character, \ie how the reset value is obtained. % {\begin{tabular}{>{\ttfamily}ll} % width & Width is reset value: `\meta{value}\meta{char}', \eg `\texttt{0R}'. % Value can not be negative.\\ % arg & Reset value is provided as argument: `\meta{char}\marg{value}', \eg % `\texttt{R\{-1\}}'.\\ % both & Uppercase \meta{char} is \texttt{width}-type, lowercase \meta{char} % is \texttt{arg}-type reset char.\\ % Both & Lowercase \meta{char} is \texttt{width}-type, uppercase \meta{char} % is \texttt{arg}-type reset char.\\ % \end{tabular}} \\ % base=\meta{Num 2-36} & Defines the numeric base of the counter. If not used the % base 10 is used.\\ % \midrule % increment=\small\meta{pgfmath expression} & % Sets the increment which is added every time the counter % character is used. This can be a formula which result is truncated % to a integer. The current counter value can be referenced as \cs{N}. % The increment can be negative which causes % the counter to count down. Default: 1\\ % max value=\small\meta{pgfmath expression} & Sets the maximum counter value. Default: \emph{not set}\\ % min value=\small\meta{pgfmath expression} & Sets the minimum counter value. Default: \emph{not set}\\ % wraps=\meta{true\Pipe false} & % If set to \texttt{true} the counter wraps around, \ie it counts to the % minimum value when counting over the maximum value or the other % way around if \texttt{increment} is negative. % Initial value: \texttt{false}. Default value: \texttt{true}\\ % \midrule % bg style=\meta{TikZ style(s)} & Sets the background style of the counter.\\ % fg style=\meta{TikZ style(s)} & Sets the foreground (line etc.) style of the counter.\\ % text style=\meta{TikZ style(s)} & Sets the text style of the counter.\\ % text format=\meta{\TeX code} & Sets the format code of the counter value. This should be a macro which receives % the counter value as first argument.\\ % \bottomrule % \end{tabularx} % }% % \end{table} % % \subsubsection*{Examples:} % \noindent % Counter character "Q" with base 16 (hexadecimal). "R" resets the % counter. The counter value should be in blue text typer font.\\*\noindent % |\tikzset{timing/new counter={char=Q,base=16,reset char=R}}|\\*\noindent % |\tikzset{timing/counter/Q/text/.style={font=\ttfamily,blue}}|\\*\noindent % |\texttiming{ 3Q 3{Q} R 12{Q} 2R Q qq 0R 3{Q} }|\\*\noindent % gives: {% % \tikzset{timing/counter/new={char=Q,base=16,reset char=R}}% % \tikzset{timing/counter/Q/text/.style={font=\ttfamily,blue}}% % \texttiming{ 3Q 3{Q} R 12{Q} 2R Q qq 0R 3{Q} }% % }% % % \par\bigskip % \noindent % \begingroup % \lstset{basicstyle=\ttfamily\scriptsize} % \begin{examplecode} % \scalebox{2}{% % \begin{tikztimingtable} % Dec & [timing/counter/new={char=Q,max value=15, wraps,text style={font=\scriptsize}}] 33{Q}d\\ % Bin & [timing/counter/new={char=Q,max value=15,base=2, digits=4,wraps,text style={font=\tiny,scale=.8}}] 33{Q}d\\ % Oct & [timing/counter/new={char=Q,max value=15,base=8, digits=3,wraps,text style={font=\tiny}}] 33{Q}d\\ % Hex & [timing/counter/new={char=Q,max value=15,base=16, wraps,text style={font=\scriptsize}}] 33{Q}d\\ % \extracode % \begin{background}[shift={(0.1,0)},help lines] % \vertlines{} % \end{background} % \end{tikztimingtable} % }% % \end{examplecode} % \endgroup % % \clearpage % \library{advnodes}{Advanced Nodes} % The library "advnodes"\NewIn{v0.7} changes the in-line nodes, \ie the "N" character, to provide multiple % transition dependent and independent node anchors shown in Table~\ref{tab:advanchor}. % % Most transitions provide the three logic level anchors "low", "mid" and "high" which lie % on the drawn timing line. Transitions of `double line' characters like "D" can have % two low and/or high level anchors which are called "low2" and "high2". % % To align marker lines over multiple rows inside a \env{tikztimingtable} a set of transition % independent node anchors are provided: "LOW", "MID", "HIGH". This anchors lie all at the begin of the % transition at the appropriate logic levels. % With the normal coordinate-like in-line nodes the vertical node (center) position has to be taken into % account, while this advanced anchors do this automatically. % % Often marker lines should start and end with a little vertical offset from the timing diagram to be more distinguishable. % For this the two anchors "TOP" and "BOTTOM" exist. They lie above and below of "HIGH" and "LOW", respectively. % The vertical distance can be set using `|timing/nodes/offset=|\meta{dim.~or number}'. % % \textbf{Please note} that the node \emph{center} of advanced nodes will be different for some transitions. % The "center" anchor (used by default if no node anchor is provided) will be placed at the logical center of the % transition, \ie mostly in the middle of it. In order not to break existing diagrams which use nodes as references % to draw additional material an TikZ styles is provided to select between the old and new node centers. This styles % can be used globally or locally as required. The two explicit anchors "new center" and "old center" are also % provided. For existing documents with diagrams using normal nodes it is recommended % to switch to simple nodes or to the old node centers globally or select such a style for each old diagram. % % The following TikZ settings can be used with the library. The node style settings affect all new nodes after them. % The center settings affect all following \emph{references} (\eg "(NodeName)" or "(NodeName.center)") of advanced nodes. % The settings can be used as library options with the "timing/nodes/" part removed. % % \vfill\noindent % \begin{tabularx}{\textwidth}{>{\ttfamily}lX} % \toprule % \normalfont % TikZ Setting & Description \\ % \midrule % timing/nodes/advanced & Selects advanced in-line nodes. (library default) \\ % timing/nodes/simple & Selects simple coordinate-style in-line nodes. (package default) \\ % \midrule % timing/nodes/new center & Center of in-line nodes is in the new position. (default for \texttt{advanced}) \\ % timing/nodes/old center & Center of in-line nodes is in the old position. (always on for \texttt{simple}) \\ % \midrule % timing/nodes/offset & Sets offset for \texttt{TOP} and \texttt{BOTTOM} anchors. % Can be a dimension with unit or a factor to the current \texttt{y} unit. (default: 0.25) \\ % \bottomrule % \end{tabularx} % % \subsection*{Examples:} % "\usetikztiminglibrary[simple]{advnodes}"\ \ loads the library with nodes default to the old "simple" style.\\\noindent % "\usetikztiminglibrary[old center]{advnodes}"\ \ \ loads the library with advanced nodes with have the center at the same % place as the normal simple nodes. This is a good ``compatibility mode'' for existing pre-v0.7 diagrams.\\\noindent % "\begin{tikztimingtable}[timing/nodes/simple]"\ \ starts a timing table which uses simple nodes. \\\noindent % "\begin{tikztimingtable}[timing/nodes/.cd,advanced,old center]"\\\noindent starts a timing table which uses advanced nodes with old node centers. % % % \begin{table} % \caption{Transition Dependent Anchor Points of Advanced Nodes}^^A % \label{tab:advanchor}^^A % \makeatletter % \let\mid\relax %^^A % \tikzset{timing/draw grid}^^A % \tikzset{timing/.cd, % lslope=.5, % dslope=.5, % zslope=.5, % }^^A %^^A % \tikzset{^^A % marker/.style={opacity=.8,fill opacity=.8}, % low/.style={marker,draw=red}, % mid/.style={marker,draw=yellow}, % high/.style={marker,draw=green}, % low2/.style={marker,draw=red!50!black}, % high2/.style={marker,draw=green!50!black}, % LOW/.style={marker,CAPITAL,draw=red}, % MID/.style={marker,CAPITAL,draw=yellow}, % HIGH/.style={marker,CAPITAL,draw=green}, % CAPITAL/.style={marker,mark=x,mark size=2\pgflinewidth}, % origin/.style={marker,mark=x,draw=gray}, % center/.style={marker,mark=+,draw=black}, % old center/.style={marker,mark=+,mark size=2\pgflinewidth,draw=blue}, % new center/.style={marker,mark size=\pgflinewidth,mark=*,fill=blue,draw=blue}, % }^^A %^^A % \newcommand\namark[2][]{^^A % \draw[mark=o,mark size=3\pgflinewidth,#1] plot coordinates {(#2)} % }^^A %^^A % \def\NodeAnchors#1#2{^^A % \Huge % {\raisebox{-.5ex}{\scalebox{1}{^^A % \begin{tikzpicture}[timing/picture,line width=.5\pgflinewidth] % \let\pgf@sh@ma@A\@undefined % \timing [name=T] at (0,0) {#1 N(A) #2}; % \useasboundingbox (T.south west) rectangle (T.north east); % ^^A % \pgf@sh@ma@A % \anchorpoints % \foreach \a in {LOW,MID,HIGH,old center,new center} {^^A % \namark[gray,\a]{A.\a};^^A % }^^A % \foreach \a in {low,mid,high,low2,high2} {^^A % \@ifundefined{\a}{}^^A % {\namark[semithick,\a]{A.\a};}^^A % }^^A % \namark[old center,blue]{A.old center};^^A % \end{tikzpicture}^^A % }}}^^A % \Huge\strut % }^^A %^^A % \def\bchars{,L,H,X,D,E}^^A % \def\achars{,L,H,X,D,D{A},E,0LE,0HE}^^A %^^A % \def\DA{D{A}}^^A % \def\tablecontent{^^A % \begin{tabular}{lrrrrrrrrrrrrrrrrrr}^^A % \toprule % \tikzpicture % \useasboundingbox (-1ex,-.5ex) rectangle (1ex,.5ex); % \node {^^A % \scalebox{0.4}^^A % {\rotatebox{-45}{$\frac{\mbox{\rotatebox{45}{to}}}^^A % {\mbox{\rotatebox{45}{from}}}$}}^^A % };^^A % \endtikzpicture % } %^^A % \def\atc#1{^^A % \begingroup % \edef\@tempa{#1}^^A % \expandafter\g@addto@macro\expandafter\tablecontent % \expandafter{\@tempa}^^A % \endgroup % }^^A %^^A % \foreach \b in \bchars {^^A % \atc{& \noexpand\multicolumn{1}{c}{\b}}^^A % }^^A %^^A % \atc{\noexpand\\ \noexpand\midrule}^^A %^^A % \foreach \a in \achars {^^A % \ifx\a\DA % \atc{D\noexpand\{A\noexpand\}}^^A % \else % \atc{\a}^^A % \fi % \foreach \b in \bchars {^^A % \atc{& \noexpand\NodeAnchors{\a}{\b}}^^A % ^^A \hbox to 5em{\llap{\a\b:} \NodeAnchors{\a}{\b}}^^A % }^^A % \atc{\noexpand\\}^^A % }^^A %^^A % \atc{^^A % \noexpand\bottomrule % \noexpand\end{tabular}^^A % }^^A %^^A % \sffamily\centering % \tablecontent %^^A % \def\legend#1#2{^^A % \namark[#1]{[shift={(0,.125ex)}]#2}; \node [right] at (#2) {\normalsize #1\strut} % }^^A % \par % \Huge % \begin{tikzpicture}[timing/picture,line width=.5\pgflinewidth] % \node [left] at (-1,0) {\large Legend:}; % \legend{low}{0,0}; % \legend{mid}{3,0}; % \legend{high}{6,0}; % \legend{low2}{0,-.8}; % \legend{high2}{6,-.8}; % \legend{LOW}{0,-1.6}; % \legend{MID}{3,-1.6}; % \legend{HIGH}{6,-1.6}; % \legend{new center}{0,-2.4}; % \legend{old center}{6,-2.4}; % \end{tikzpicture}^^A % \end{table} % % \clearpage % \library{ifsym}{Compatibility Macros for \texttt{ifsym} package} % The library "ifsym"\NewIn{v0.7} provides macros and timing styles to emulate the behaviour of the \pkg{ifsym} package % when loaded with the |electronic| option. The \pkg{ifsym} package was an early inspiration to this package % and this library allows the usage of |ifsym| style timing symbol macros and characters % (`|\textifsym|\marg{characters}' which uses `|\texttiming[timing/ifsym]|\marg{characters}') % which are described in Table~\ref{tab:ifsymmacros} and Table~\ref{tab:ifsym}, respectively. % This is useful if old |ifsym| timing diagrams should be reused. The |tikz-timing| replacements are a very close match % and do not need a special font to be installed. The graphic quality should be equal or better than the original. % The intermixing of |ifsym| and |tikz-timing| style characters in a \cs{textifsym} macro % (the one provided by this library, not the one from the \pkg{ifsym} package) is supported but it is not guaranteed to work % 100\% properly. Please note that the "M" character is defined to use "X" in black. % % The library can be loaded with one of the options "provide" (default), "new", "renew" or "off", respectively. % These select if the macros should be defined using \cs{providecommand}, \cs{newcommand}, \cs{renewcommand} % or not at all. This can be useful if the \pkg{ifsym} package is loaded beforehand. % % % \sbox{\sba}{%^^A % \begin{tabular}{lll} % \toprule % Macro & Symbol & Description (trivial) \\ % \midrule % \cs{RaisingEdge} & \RaisingEdge & Raising Edge \\ % \cs{FallingEdge} & \FallingEdge & Falling Edge \\ % \cs{ShortPulseHigh} & \ShortPulseHigh & Short Pulse High \\ % \cs{ShortPulseLow} & \ShortPulseLow & Short Pulse Low \\ % \cs{PulseHigh} & \PulseHigh & Normal Pulse High \\ % \cs{PulseLow} & \PulseLow & Normal Pulse Low \\ % \cs{LongPulseHigh} & \LongPulseHigh & Long Pulse High \\ % \cs{LongPulseLow} & \LongPulseLow & Long Pulse Low \\ % \bottomrule % \end{tabular}%^^A % }%^^A % ^^A % \sbox{\sbb}{%^^A % \begin{tabular}{>{\ttfamily}lll} % \toprule % \normalfont % Character & Symbol & Description \\ % \midrule % l, h & \textifsym{l}, \textifsym{h} & Short low or high level signal. \\ % L, H & \textifsym{L}, \textifsym{H} & Long low or high level signal. \\ % \pipe & \textifsym{|} & Transition/glitch between L/H or H/L levels. \\ % m, d & \textifsym{m}, \textifsym{d} & Short middle or double level signal. \\ % M, D & \textifsym{M}, \textifsym{D} & Long middle or double level signal. \\ % <, << & \textifsym{<}, \textifsym{<<} & Short or long slope between middle and double level. \\ % >, >> & \textifsym{>}, \textifsym{>>} & Short or long slope between double and middle level. \\ % \bottomrule % \end{tabular} % }%^^A % % \ifprintversion % % \begin{table} % \centering % \caption[ifsym style Timing Symbol Macros]{\texttt{ifsym} style Timing Symbol Macros} % \label{tab:ifsymmacros} % \usebox{\sba}%^^A % \end{table} % % \begin{table} % \centering % \caption[ifsym style Timing Characters]{\texttt{ifsym} style Timing Characters (from \pkg{ifsym} manual)} % \label{tab:ifsym} % \usebox{\sba}%^^A % \end{table} % % \else % % \begingroup % \expandafter\def\csname @captype\endcsname{table}% % \makebox[\textwidth][c]{%^^A % \let\tablecaption\caption % \begin{minipage}{\wd\sba} % \tablecaption[ifsym style Timing Symbol Macros]{\texttt{ifsym} style Timing Symbol Macros}%^^A % \label{tab:ifsymmacros}%^^A % \usebox{\sba}%^^A % \end{minipage} % \hspace{1em}\hfill % \begin{minipage}{\wd\sbb} % \tablecaption[ifsym style Timing Characters]{\texttt{ifsym} style Timing Characters (from \texttt{ifsym} manual)}%^^A % \label{tab:ifsym}%^^A % \usebox{\sbb}%^^A % \end{minipage} % }%^^A % \endgroup % % \fi % % \clearpage % \library{interval}{Intervals (experimental)} % \textbf{This library is under development and might change in the future.} % % The library "interval"\NewIn{v0.7} allows the drawing of intervals using the "H", "L", "Z" and "X" logic levels. % It provides modified definitions of X and Z transitions (e.g.~"LX", "XH") where the transition edges can % be coloured either way to indicate interval borders. % % The interval borders can be set using the `|timing/interval=|\marg{settings}' TikZ style. The % \meta{settings} are "lo" (left-open), "lc" (left-closed) and "ro" (right-open), "rc" (right-closed), which build the % following combinations: "{lo,ro}", "{lc,ro}", "{lo,rc}" and "{lc,rc}". However, every of them can also be set on its own, % e.g.\ "timing/interval={lc}" simply sets the interval to `left-closed' without changing the right border. % % The key "timing/interval/normal" (alternative: "timing/interval={normal}") sets the transitions back to their default. % % \par\medskip % \noindent % Examples: % \begingroup % \tikzset{timing/draw grid,timing/slope=0}\sffamily % \newcommand*\ttt[2][]{\texttiming[timing/interval={#1}]{#2}} % \newcommand*\extab[1]{% % \begin{tabular}{rcc} % & ro & rc \\ % lo & \ttt[lo,ro]{#1} & \ttt[lo,rc]{#1} \\ % lc & \ttt[lc,ro]{#1} & \ttt[lc,rc]{#1} \\ % \end{tabular} % } % \extab{zlzlz} % \endgroup % \par\bigskip % % \noindent % A meta-character can be defined for quick changes if necessary:\\[\smallskipamount] % \begingroup % |\tikztimingmetachar{Y}{[timing/interval={lo,ro}]}|\\ % |\tikztimingmetachar{y}{[timing/interval/normal]}|\\ % |\texttiming[timing/draw grid]{ LZH Y HZH y LZH Y LZL } |\\ % |\texttiming[timing/draw grid]{ LXH Y HXH y LXH Y LXL } |\\ % gives: % \tikztimingmetachar{Y}{[timing/interval={lo,ro}]} % \tikztimingmetachar{y}{[timing/interval/normal]} % \texttiming[timing/draw grid]{ LZH Y HZH y LZH Y LZL } % \texttiming[timing/draw grid]{ LXH Y HXH y LXH Y LXL } \\ % \endgroup % % \par\bigskip % \noindent % A further alternative is to use a meta-character with an argument. % Note that "#2" must be used, because "#1" holds the width, which is irrelevant here. % This definition is also provided by the `|timing/interval/metachar|=\meta{Character}' key. % \\[\smallskipamount] % \begingroup % |\tikztimingmetachar{I}[2]{[timing/interval={#2}]}|\\ % or % |\tikzset{timing/interval/metachar=I}|\\ % |\texttiming[timing/draw grid]{ LZH I{lo,rc} HZH I{ro} LZH I{normal} LZL } |\\ % gives: % \tikztimingmetachar{I}[2]{[timing/interval={#2}]} % \texttiming[timing/draw grid]{ LZH I{lo,rc} HZH I{ro} LZH I{normal} LZL }\\ % \endgroup % % \clearpage % \library{beamer}{Beamer Overlay Support (experimental)} % \textbf{This library is under development and might change in the future.} % % The library "beamer"\NewIn{v0.7} provides (at the moment) marginal support for overlays of the \pkg{beamer} class. % It allows the usage of beamer \emph{overlay specifications} (|<|\meta{spec}|>|) inside the timing string. % However, the current simple implementation might not work properly and cause strange results. % The support is designed for use inside \env{tikztimingtable}. % See the \pkg{beamer} manual for more informations about overlays specifications. % % \subsection*{Usage} % Insert an overlay specification, e.g.~|<|\meta{number}|>|, inside the timing string. It will affect the % rest of the timing characters of the current diagram line. % Unfortunate due to the global nature of overlays it also affects the rest of the table. Therefore all % diagram lines should end with a specification which turns overlays off, i.e. |<*>| or |<0->|. Otherwise % strange results can occur (e.g.~wrong/missing background graphics). % % \paragraph*{Example} % | Timing Table Row & H L <2> Z L H <3> D{last} Z <*> \\ | % % \subsection*{Display Rows Stepwise} % The rows of a \env{tikztimingtable} can be uncovered row-by-row using the way shown below. The signal names % must be enclosed into a \cs{mbox} because \cs{uncover} needs to be inside horizontal mode. Instead % of \cs{uncover} another beamer overlay command like \cs{only} or \cs{invisible} can be used. To highlight % the signal name use \cs{alert}|<|\meta{\dots}|>|\marg{signal name} inside \cs{uncover}. % At the moment there is no simple way to highlight the timing lines. % % \begin{lstlisting}[gobble=4] % \begin{tikztimingtable} % \mbox{\uncover<+->{Signal Name 1}} & <.-> HL <*> \\ % \mbox{\uncover<+->{Signal Name 2}} & <.-> HL <*> \\ % % ... % \mbox{\uncover<+->{Signal Name n}} & <.-> HL <*> \\ % \end{tikztimingtable} % \end{lstlisting} % % \subsection*{Display Columns Stepwise} % Different sections (`columns') of timing diagrams in a \env{tikztimingtable} can be uncovered stepwise using the way shown below. % In this example the second section/column will be uncovered in the second slide. The first is always visible. Further sections/columns % can be uncovered in further slides. % % Please note that the total width of the table is constant and e.g.~\cs{tablerules} will always cover the full width independent of overlays. % % \begin{lstlisting}[gobble=4] % \begin{tikztimingtable} % Signal Name 1 & 10D{Sec. 1} <2> 10D{Sec. 2} <*> \\ % Signal Name 2 & 10D{Sec. 1} <2> 10D{Sec. 2} <*> \\ % % ... % Signal Name n & 10D{Sec. 1} <2> 10D{Sec. 2} <*> \\ % \end{tikztimingtable} % \end{lstlisting} % % \subsection*{Overlay Extra Code} % The |beamer| overlay specifications can be used inside the \cs{extracode} section like in a normal \env{tikzpicture} environment. % However, in both cases strange results will occur if the end of the environment is hidden by an overlay specification. Due to this % reason it is recommended to only use overlay commands which affect only an argument, like \cs{only}|<|\meta{\dots}|>|\marg{code}, % or to place a plain \cs{onlayer} before the end of the environment. % % \begin{lstlisting}[gobble=4] % \begin{tikztimingtable} % Signal Name 1 & 10D{Sec. 1} <2> 10D{Sec. 2} <*> \\ % % ... % \extracode % % either % \draw<2> (0,0) -- (2,0); \only<3> { ... } % % or % \onlayer<2> % % and then at the very end: % \onlayer % or \onlayer<*> % \end{tikztimingtable} % \end{lstlisting} % % \clearpage % \chapter{Examples} % This section shows some examples by putting either the full source code or % only the needed characters beside the graphical result. Please note that the % displayed syntax is the one of \cs{timing} where the initial character is % declared as optional argument (\oarg{char}) \emph{inside}/\emph{together} with % the logic characters. The syntax of \cs{textttiming} is identical except the % initial character is given as a normal optional argument before the characters % argument. % All examples except Example~\ref{exa:adv} are attached in compilable form % to this PDF. % ^^A\\[\smallskipamount] % ^^A\emph{Example notation example:} "[c]cccc" means either % ^^A|\timing{[c]cccc};| or |\texttiming[c]{cccc}|. % % \DeleteShortVerb{\|} % \begin{exampletable} % \centering % \makeatletter % \let\tikztiming@embedexample\empty % \makeatother % \pgfmathsetbasenumberlength{2} % \newcounter{hexcount} % \addtocounter{hexcount}{+8}% % \newcommand{\hexcountmacro}{% % \pgfmathdectoBase\thehexcount{\value{hexcount}}{16}% % \hbox{\thehexcount}% % \addtocounter{hexcount}{+1}% % } % \caption{Initial Characters, Modifiers, TikZ Keys}\label{exa:adv} % \def\somemacro{}% % \def\code{}% % \makebox[\textwidth][c]{% % \begin{tikztimingexampletable} % HLZXDUTC \\ % cccc \\ % tttt \\ % [c]cccc \\ % 4{c} \\ % 4c4c \\ % 4{1.8c} \\ % [d] 4{5D{Text}} 0.2D \\ % 3.4H 0.6L \\ % DDDUUUDDD \\ % DDD{}DUUDD \\ % 8{2D{\hexcountmacro}} \\ % 3{2{0.25X 2.5D .25Z}} \\ % DDD{} 3{0.2D{}} DDD \\ % DDD{} 3{0.2D{}} 0.4D{} 0.6D{} DDD \\ % HHHLLH SSSS HLLHHL \\ % HHGHHGGHHLLGLLGH \\ % ZZ G ZZ G XX G X \\ % LLL 2{0.1H 0.1L} 0.6H HH \\ % LLL [timing/slope=0.05] 4{.05H .05L} 0.6H HH\\ % LLL 0.4U 0.6H HH \\ % [L][timing/slope=1.0] HL HL HL HL HL \\ % LLLLL !{-- +(.5,.5) -- ++(1,0)} HHHHHH \\ % LLLLL [| /utils/exec={\somemacro\code} |] HHHHHH \\ % LL [green] HH [brown] XX LL ZZ [orange] HH \\ % [][line width=1pt] HLXZDU [line width=0.1pt] HLXZDU \\ % [][line width=1pt] HLXZDU ,[line width=0.1pt] HLXZDU \\ % [][line width=1pt] HLXZDU ;[line width=0.1pt] HLXZDU \\ % \end{tikztimingexampletable}% % } % \\\scriptsize % \emph{Note:} Optional argument must be placed before macro argument if % \cs{texttiming} is used. % % \end{exampletable} % \MakeShortVerb{\|} % % \begin{example} % \centering % \begin{examplecode} % \begin{tikztimingtable} % Name & hLLLLh \\ % Clock & 10{c} \\ % Signal & z4D{Text}z \\ % \end{tikztimingtable} % \end{examplecode} % \caption[tikztimingtable without extracode]{\env{tikztimingtable} without \cs{extracode}.} % \end{example} % % \begin{example} % \centering % \begin{examplecode} % \begin{tikztimingtable} % Name & hLLLLh \\ % Clock & 10{c} \\ % Signal & z4D{Text}z \\ % \extracode % \draw (0,0) circle (0.2pt); % Origin % \begin{pgfonlayer}{background} % \vertlines[help lines]{0.5,4.5} % \end{pgfonlayer} % \end{tikztimingtable} % \end{examplecode} % \caption[tikztimingtable with extracode]{\env{tikztimingtable} with \cs{extracode}.} % \end{example} % % \begin{example} % \centering % \begin{examplecode} % \begin{tikzpicture}[x=4cm,y=4cm] % \draw (0,0) rectangle (1,1); % \draw (0.2,0.7) circle (10pt); % \begin{scope}[green] % \draw (0.1,0.1) -- +(0.8,0.2); % \timing at (0.3,0.4) {hlzhhlhhl}; % \end{scope} % \timing [rotate=-30] % at (0.4,0.7) {HLZHHLHHL}; % \end{tikzpicture} % \end{examplecode} % \caption[timing inside general tikzpicture]{\cs{timing} inside general \envv{tikzpicture}.} % \end{example} % % \begin{example} % \centering % \def\exampleextraheader{\noexpand\usetikztiminglibrary{advnodes}} % \begin{examplecode} % \Huge % \begin{tikzpicture}[timing/picture,thick, % timing/nodes/advanced] % \timing at (0,2) {hH N(A) LHLHL}; % \timing[timing/slope=.25] at (0,0) % {HLL N(B) HHLl}; % \draw [orange,semithick] % (A.mid) ellipse (.2 and .6) % (B.mid) ellipse (.2 and .6); % \draw [orange,semithick,->] % ($ (A.mid) - (0,.6) $) % parabola [bend pos=0.5] % ($ (B.mid) + (0,.6) $); % \end{tikzpicture} % \end{examplecode} % \caption{Using In-Line Nodes to draw Relationships.}\label{exa:inlinenodes} % \end{example} % % \begin{example} % \centering % \lstset{basicstyle=\scriptsize\ttfamily} % \begin{examplecode} % \def\degr{${}^\circ$} % \begin{tikztimingtable} % Clock 128\,MHz 0\degr & H 2C N(A1) 8{2C} N(A5) 3{2C} G \\ % Clock 128\,MHz 90\degr & [C] 2{2C} N(A2) 8{2C} N(A6) 2{2C} C \\ % Clock 128\,MHz 180\degr & C 2{2C} N(A3) 8{2C} N(A7) 2{2C} G \\ % Clock 128\,MHz 270\degr & 3{2C} N(A4) 8{2C} N(A8) 2C C \\ % Coarse Pulse & 3L 16H 6L \\ % Coarse Pulse - Delayed 1 & 4L N(B2) 16H N(B6) 5L \\ % Coarse Pulse - Delayed 2 & 5L N(B3) 16H N(B7) 4L \\ % Coarse Pulse - Delayed 3 & 6L 16H 3L \\ % \\ % Final Pulse Set & 3L 16H N(B5) 6L \\ % Final Pulse $\overline{\mbox{Reset}}$ & 6L N(B4) 16H 3L \\ % Final Pulse & 3L N(B1) 19H N(B8) 3L \\ % \extracode % \tablerules % \begin{pgfonlayer}{background} % \foreach \n in {1,...,8} % \draw [help lines] (A\n) -- (B\n); % \end{pgfonlayer} % \end{tikztimingtable} % \end{examplecode} % \caption{Using In-Line Nodes to draw Marker Lines.} % \end{example} % % \begin{example} % \centering % \lstset{basicstyle=\scriptsize\ttfamily} % \def\exampleextraheader{\noexpand\usetikztiminglibrary{advnodes,either}^^J % \noexpand\usepackage{amsmath}} % \begin{examplecode} % \def\degr#1{\makebox[2em][r]{#1}\ensuremath{{}^{\circ}}}% % % \begin{tikztimingtable}[% % timing/dslope=0.1, timing/.style={x=2ex,y=2ex}, x=2ex, % timing/rowdist=3ex, % timing/name/.style={font=\sffamily\scriptsize}, % timing/nodes/advanced, % ] % Clock \degr{90} & l 2{C} N(A1) 5{C} \\ % Clock \degr{180}& C 2{C} N(A2) 4{C} c\\ % Clock \degr{270}& h 3{C} N(A3) 4{C} \\ % Clock \degr{0} & [C] 2{C} N(A0) 2{C} N(A4) 3{C}c ;[dotted] % 2L; 2{C} N(A5) 3{C} \\ % Start of T$_{\text{sw}}$ & 4S G N(start) \\ % Input Pulse & 2.0L 2H 3.5L ;[dotted] 2L; 5L \\ % Set 3 & 2.5L 2H 3.0L ;[dotted] 2L; 5L \\ % Set 2 & 3.0L 2H 2.5L ;[dotted] 2L; 5L \\ % Set 1 & 3.5L 2H 2.0L ;[dotted] 2L; 5L \\ % Set 0 & 4.0L 2H 1.5L ;[dotted] 2L; 5L \\ % Reset & 7.5L ;[dotted] 2L; 2L N(reset) 2H 1L \\ % Final Pulse & 2.5L N(B1) e N(B2) e N(B3) e 3.5H; [dotted] % 2H; 2H 3L \\ % Counter & N(x) 2D{Full} N(B0) 2D{0} N(B4) 2D{1} 1.5D;[dotted] % .25D{2} 1.75D{}; % 2D{~D$_\text{M}$} N(B5) 2D{D$_\text{M}$+1} D N(y)\\ % \extracode % %\tablegrid % \node[anchor=north] at ($ (x) ! .5 ! (y) - (0,.75) $) % {\scriptsize D$_\text{M}$ = MSBs of Duty Cycle}; % \begin{background}[timing/picture,line width=.06ex,color=black!60] % \foreach \n in {0,...,5} % \draw (A\n.TOP) -- (B\n.BOTTOM); % \end{background} % \end{tikztimingtable}% % \end{examplecode} % \caption{Adjusting Diagram Parameters and using Advanced In-Line Nodes to draw Marker Lines.} % \end{example} % % \begin{example} % \centering % \lstset{basicstyle=\ttfamily\footnotesize} % \def\texta{}\def\textb{}^^A % \makeatletter % \ifpdf % \IfFileExists{SR_FF_timing_diagram.png}{^^A % \def\texta{ (left top)}\def\textb{ (left bottom)}^^A % \def\PrintExample{% % \begingroup % \BoxExample % \par\noindent % \centerline{%^^A % \minipage[c]{\wd\exampleresultbox}%^^A % \hbox to \textwidth{\hss\fbox{\usebox{\exampleresultbox}}}%^^A % \vspace*{1cm}%^^A % \hbox to \textwidth{\hss\fbox{\includegraphics[width=27ex]{SR_FF_timing_diagram.png}}}%^^A % \endminipage% % \hfill % \minipage[c]{\wd\examplecodebox} % \hbox{\usebox{\examplecodebox}} % \endminipage% % } % \endgroup % \par % }%^^A % }{}%^^A % \fi % \begin{examplecode} % \definecolor{bgblue}{rgb}{0.41961,0.80784,0.80784}% % \definecolor{bgred}{rgb}{1,0.61569,0.61569}% % \definecolor{fgblue}{rgb}{0,0,0.6}% % \definecolor{fgred}{rgb}{0.6,0,0}% % \begin{tikztimingtable}[timing/slope=0, % timing/coldist=2pt,xscale=2.05,yscale=1.1,semithick] % \scriptsize clock & 7{C}\\ % S & .75L h 2.25L H LLl [fgblue]\\ % R & 1.8L .8H 2.2L 1.4H 0.8L [fgblue]\\ % Q & L .8H 1.7L 1.5H LL\\ % $\overline{\mbox{Q}}$ & H .8L 1.7H 1.5L HH\\ % Q & LHHHHLL[fgred]\\ % $\overline{\mbox{Q}}$ & HLLLLHH[fgred]\\ % \extracode % \makeatletter % \begin{pgfonlayer}{background} % \shade [right color=bgblue,left color=white] % (7,-8.45) rectangle (-1,-4.6); % \shade [right color=bgred,left color=white] % (7,-12.8) rectangle (-1,-8.6); % \begin{scope}[gray,semitransparent,semithick] % \horlines{} % \foreach \x in {1,...,6} % \draw (\x,1) -- (\x,-12.8); % % similar: \vertlines{1,...,6} % \end{scope} % \node [anchor=south east,inner sep=0pt] % at (7,-8.45) {\tiny clocked}; % \node [anchor=south east,inner sep=0pt,fgred] % at (7,-12.8) {\tiny positive edge triggered}; % \end{pgfonlayer} % \end{tikztimingtable}% % \end{examplecode} % \caption[SR flip-flop timing diagram]{SR flip-flop timing diagram\texta. % Redrawn from image\textb\\ {\small % \url{http://commons.wikimedia.org/wiki/File:SR_FF_timing_diagram.png} % }} % \end{example} % % \begin{example} % \centering % \lstset{basicstyle=\ttfamily\scriptsize} % \begin{examplecode} % \begin{tikztimingtable}[ % timing/d/background/.style={fill=white}, % timing/lslope=0.2, % timing/counter/new={char=Q,reset char=R}, % ] % CPOL=0 & LL 15{T} LL \\ % CPOL=1 & HH 15{T} HH \\ % & H 17L H \\ % \\ % Cycle \# & U R 8{2Q} 2U \\ % MISO & D{z} R 8{2Q} 2D{z} \\ % MOSI & D{z} R 8{2Q} 2D{z} \\ % \\ % Cycle \# & UU R 8{2Q} U \\ % MISO & D{z}U R 8{2Q} D{z} \\ % MOSI & D{z}U R 8{2Q} D{z} \\ % \extracode % % Add vertical lines in two colors % \begin{pgfonlayer}{background} % \begin{scope}[semitransparent,semithick] % \vertlines[red]{2.1,4.1,...,17.1} % \vertlines[blue]{3.1,5.1,...,17.1} % \end{scope} % \end{pgfonlayer} % % Add big group labels % \begin{scope} % [font=\sffamily\Large,shift={(-6em,-0.5)},anchor=east] % \node at ( 0, 0) {SCK}; \node at ( 0,-3 ) {SS}; % \node at (1ex,-9) {CPHA=0}; \node at (1ex,-17) {CPHA=1}; % \end{scope} % \end{tikztimingtable}% % \end{examplecode} % \caption[SPI Interface Timing]{SPI Interface Timing. Redrawn from % image {\small % \url{http://en.wikipedia.org/wiki/File:SPI_timing_diagram.svg}}} % \end{example} % % \clearpage % \StopEventually{} % \clearpage % \iffalse % % \fi % % % \chapter{Implementation} % % \subsection{Package Header} % \iffalse %<*tikz-timing.sty> % \fi % \begin{macrocode} % \NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesPackage{tikz-timing}[% % % %<*DRIVER> 2099/01/01 develop % Digital Timing Diagrams using TikZ] % \end{macrocode} % % \begin{macrocode} \RequirePackage{tikz} \usetikzlibrary{calc} \usetikzlibrary{backgrounds} \usetikzlibrary{decorations.pathmorphing} \ifx\collect@body\@undefined \IfFileExists{environ.sty} {\RequirePackage{environ}} {\RequirePackage{amsmath}} \fi % \end{macrocode} % % \section{General Definitions} % % \begin{macrocode} \def\tikztimingwidth{0.0} \newcount\tikztiming@numint \newcount\tikztiming@numfrac \def\tikztiming@wscale{1.0}% \def\tikztimingsetwscale#1{% \pgfmathparse{#1}% \let\tikztiming@wscale\pgfmathresult } \def\tikztiming@num{0.0}% \let\tikztiming@back\empty \newlength\tikztiming@xunit \newlength\tikztiming@yunit \def\tikztiming@@xunit{1.6ex}% \def\tikztiming@@yunit{1.6ex}% \setlength{\tikztiming@xunit}{\tikztiming@@xunit}% \setlength{\tikztiming@yunit}{\tikztiming@@yunit}% \def\tikztiming@setnum#1{% \pgfmathparse{#1}% \global\let\tikztiming@num\pgfmathresult } \newcount\tikztiming@debug \def\tikztiming@xsep{0pt} \def\tikztiming@ysep{0pt} \newcounter{tikztiming@nrows}% \def\tikztiming@rowdist{2}% \def\tikztiming@coldist{1}% \def\tikztiming@prefix{tikztiming@trans@}% \def\tikztiming@ttt#1#2#3{#1#2#3}% \def\tikztiming@pfxtr{% \tikztiming@prefix\expandafter\tikztiming@ttt } \def\timingwidth{1}% \def\timingheight{1}% % \end{macrocode} % \section{TikZ Style Settings} % \begin{macrocode} \tikzset{% timing/.style={/tikz, line cap=round, line join=round, timing/adjust@xy, every path/.append code={\tikz@expandcount=\tikztiming@expandcount\relax}, },% } \tikzset{% timing/.cd, adjust@xy/.style={% /utils/exec={% \tikz@textfont \let\@tempa\fsize \let\fsize\@tempdima \fsize=\f@size pt\relax \pgfmathsetlength{\tikztiming@xunit}{\tikztiming@@xunit}% \pgfmathsetlength{\tikztiming@yunit}{\tikztiming@@yunit}% \let\fsize\@tempa },% /tikz/x=\tikztiming@xunit, /tikz/y=\tikztiming@yunit, }, expand count/.store in={\tikztiming@expandcount}, expand count=1000, unit/.style={% /utils/exec={% \def\tikztiming@@xunit{#1}% \let\tikztiming@@yunit\tikztiming@@xunit },% /tikz/timing/adjust@xy,% }, xunit/.style={% /utils/exec={% \def\tikztiming@@xunit{#1}% },% /tikz/timing/adjust@xy,% }, yunit/.style={% /utils/exec={% \def\tikztiming@@yunit{#1}% },% /tikz/timing/adjust@xy,% }, font/.style={% /tikz/font={#1}, /tikz/timing/adjust@xy },% initchar/.value required, initchar/.code={\uppercase{\gdef\tikztiming@lastchar{#1}}}, metachar/.code={\tikztimingmetachar#1}, grid/.style={timing,help lines}, @grid/.code={\texttiminggrid}, draw grid/.style={% timing/before text/.append style={timing/@grid},% timing/before/.append style={timing/@grid}% }, no grid/.style={timing/@grid/.code={}}, before/.code={}, after/.code={}, before text/.code={\texttimingbefore}, after text/.code={\texttimingafter}, picture/.style={timing,line width=0.15ex}, intext/.style={timing,line width=0.15ex}, inline node/.style={shape=coordinate}, inline node/from char/.store in=\tikztiming@node@fromchar, inline node/to char/.store in=\tikztiming@node@tochar, table/.style={font=\sffamily,timing,line width=0.15ex}, before table/.code={}, after table/.code={}, coord/.style={coordinate}, save/.style={coordinate}, restore/.style={/utils/exec={\expandafter\tikzset\expandafter{\tikztiming@saved@options}}}, option/.style={/utils/exec={\g@addto@macro\tikztiming@saved@options{#1,}},#1}, nooptions/.style={/utils/exec={\gdef\tikztiming@saved@options{}}}, popoptions/.style={/utils/exec={\tikztiming@popoptions}}, pushoptions/.style={/utils/exec={\tikztiming@pushoptions}}, name/.style={inner sep=0pt,outer sep=0pt,minimum size=0pt}, text format/.store in=\tikztiming@textformat, @/.style={}, every char/.style={}, every bg/.style={}, D/.style={timing/d}, D/text/.style={timing/d/text}, D/background/.style={timing/d/background}, D@edge@/.style={timing/d@edge@}, D@edge@/text/.style={timing/d@edge@/text}, D@edge@/background/.style={timing/d@edge@/background}, U/.style={timing/u}, U/text/.style={timing/u/text}, U/background/.style={timing/u/background}, U@edge@/.style={timing/u@edge@}, U@edge@/text/.style={timing/u@edge@/text}, U@edge@/background/.style={timing/u@edge@/background}, H/.style={timing/h}, L/.style={timing/l}, E/.style={timing/e}, E/background/.style={timing/e/background}, M/decoration/.style={timing/m/decoration}, M/base/.style={timing/m/base}, M/.style={timing/m}, G/.style={timing/g}, Z/.style={timing/z}, T/.style={timing/t}, C/.style={timing/c}, X/.style={timing/x}, d/.style={}, d/text/.style={timing,scale=0.6,font=\sffamily}, d/background/.style={draw=none}, d@edge@/.style={timing/d}, d@edge@/text/.style={timing/d/text}, d@edge@/background/.style={timing/d/background}, u/.style={}, u/background/.style={draw=none,fill=gray}, u@edge@/.style={timing/u}, u@edge@/text/.style={timing/u/text}, u@edge@/background/.style={timing/u/background}, h/.style={}, l/.style={}, e/.style={}, e/background/.style={draw=none}, m/decoration/.style={decorate,% decoration={zigzag,segment length=.25\tikztiming@xunit, amplitude=.225\tikztiming@yunit}}, m/base/.style={black!40!brown}, m/.style={timing/m/base,timing/m/decoration}, g/.style={decorate=false}, z/.style={blue}, t/.style={}, c/.style={timing/lslope=0.0}, x/.style={red}, table/grid/.style={timing/grid}, table/lines/.style={}, table/rules/.style={line width=0.08em,line cap=butt}, table/midrules/.style={line width=0.05em,line cap=butt}, table/header/.style={timing/name}, table/label header/.style={}, table/row header/.style={}, slope/.code={% \tikztimingsetslope{#1}% \tikztimingsetdslope{2*#1}% \tikztimingsetzslope{#1/2}% }, lslope/.code={\tikztimingsetslope{#1}}, dslope/.code={\tikztimingsetdslope{#1}}, zslope/.code={\tikztimingsetzslope{#1}}, wscale/.code={\tikztimingsetwscale{#1}}, coldist/.store in=\tikztiming@coldist, rowdist/.store in=\tikztiming@rowdist, outer xsep/.store in=\tikztiming@xsep, outer ysep/.store in=\tikztiming@ysep, outer sep/.style={/tikz/timing/outer xsep=#1,/tikz/timing/outer ysep=#1}, % debug/level/.code={\tikztiming@debug=#1\relax}, debug/level/.value required, debug/scope/.style={font=\sffamily\tiny,gray}, debug/node/.style={above,inner sep=2pt}, debug/nodes/.style={% /tikz/timing/after table/.append code={\tikztiming@marknodes{\tikztiming@namednodes}}, /tikz/timing/after text/.append code={\tikztiming@marknodes{\tikztiming@namednodes}} }, debug/markcmd/.store in={\tikztiming@markcmd}, } \tikzset{timing/inline node/.cd, from char={}, to char={} } % \end{macrocode} % % \section{Text-Mode Macros} % \begin{macro}{\texttimingbefore} % This macro is executed inside the |tikzpicture| environment of \cs{texttiming} % before the timing diagram is drawn. % \begin{macrocode} \def\texttimingbefore{} % \end{macrocode} % \end{macro} % % \begin{macro}{\texttimingafter} % This macro is executed inside the |tikzpicture| environment of \cs{texttiming} % after the timing diagram is drawn. % \begin{macrocode} \def\texttimingafter{} % \end{macrocode} % \end{macro} % % \begin{macro}{\texttiminggrid} % Draws a background grid with the "timing/grid" setting. Should be used inside % \cs{texttimingbefore}. % \begin{macrocode} \def\texttiminggrid{% \draw[xstep={\timingwidth/2.},ystep={\timingheight/2.},timing/grid] (0,0) grid (\timingwidth*\tikztimingwidth,\timingheight); } % \end{macrocode} % \end{macro} % % \section{User Level Macros} % % \begin{macro}{\texttiming}[2]{Optional initial character}{Timing characters} % This macro now only parses it optional argument to check if it is a initial % character or some style settings and then calls \cs{timing} appropriately. % \begin{macrocode} \DeclareRobustCommand*\texttiming[2][]{% \begingroup \let\tikztiming@lastchar\empty \let\tikztiming@settings\empty \tikzset{timing/before/.append style={timing/before text}}% \tikzset{timing/after/.prefix style={timing/after text}}% \ifx\relax#1\relax\else \tikztiming@testoptarg#1\relax\relax% \fi \begin{tikzpicture}[timing/intext,baseline={(0,0)}] \tikztiming@picinit \def\@tempa{\expandafter\timing\expandafter[\tikztiming@settings] at (0,0)}% \expandafter\@tempa\expandafter{\expandafter[\tikztiming@lastchar]#2};% \end{tikzpicture}% \endgroup } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@testoptarg} % \begin{macrocode} \def\tikztiming@testoptarg#1#2\relax{% \ifx\relax#2\relax \uppercase{\def\tikztiming@lastchar{#1}}% \else \def\tikztiming@settings{#1#2}% \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@picinit} % For things which should only by initialised once per |tikzpicture|. % \begin{macrocode} \def\tikztiming@picinit{% \global\let\tikztiming@namednodes\empty } \let\tikztiming@namednodes\empty % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@init} % \begin{macrocode} \def\tikztiming@init{% \def\tikztiming@lastchar{@}% \def\tikztiming@num{0}% \let\tikztiming@currentchar\empty \let\tikztiming@settings\empty \let\tikztiming@fromchar\empty \let\tikztiming@tochar\empty \let\setwscale\tikztimingsetwscale \def\wscale{\tikztiming@wscale}% \let\xunit\tikztiming@xunit \let\yunit\tikztiming@yunit \def\slope{\timingslope}% \def\lslope{\timingslope}% \def\zslope{\timingzslope}% \def\dslope{\timingdslope}% \gdef\tikztiming@saved@settings{}% \gdef\tikztiming@saved@options{}% \gdef\tikztiming@oldnodecenter@{}% \def\tikztimingwidth{0.0}% \setcounter{tikztimingtrans}{-1}% \setcounter{tikztimingtranspos}{0}% \tikztiming@initstr{% \useasboundingbox (0,0) rectangle (\tikztimingwidth,\timingheight); \draw [timing/every char] (0,0) coordinate (timing@refa) coordinate (timing@ref) at (0,\timingheight/2) coordinate (timing@refb) at (0,\timingheight) coordinate (timing/start) coordinate (timing/start base) }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikz@timing} % \begin{macrocode} \def\tikz@timing{% \@ifnextchar{[}% {\tikz@timing@}% {\tikz@timing@[]}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikz@installcommands} % Add \cs{timing} to the TikZ internal |\tikz@installcommands| macro. % The |\timing| macro will be installed at the begin of the |tikzpicture|. % \begin{macrocode} \g@addto@macro\tikz@installcommands{% \let\tikz@origtiming=\timing% \let\timing=\tikz@timing% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikz@uninstallcommands} % Add \cs{timing} to the TikZ internal |\tikz@uninstallcommands| macro. % The |\timing| macro will be uninstalled at the begin of nodes. % \begin{macrocode} \g@addto@macro\tikz@uninstallcommands{% \let\timing=\tikz@origtiming% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikz@timing@}[1]{Optional TikZ Keys} % \begin{macrocode} \def\tikz@timing@[#1]{% \@ifnextchar{a}% {\tikz@timing@at{#1}}% {\PackageWarning{tikz-timing}{The \string\timing\space command awaits now an `at' before the coordinate, like the \string\node\space command is doing. Please update your source code to ensure compatibility with newer versions}{}{}{}% \@ifnextchar{+}% {\tikz@timing@@{#1}}% {\@ifnextchar(%) {\tikz@timing@@{#1}}% {\tikz@timing@@{#1}++(0,0)}% }% }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikz@timing@at}[1]{Optional TikZ Keys} % \begin{macrocode} \def\tikz@timing@at#1at#2(#3){% \tikz@timing@@@{#1}{#2(#3)}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikz@timing@@}[3]{Optional TikZ Keys}{Potential `+' or % empty}{Coordinate} % \begin{macrocode} \def\tikz@timing@@#1#2(#3){% \tikz@timing@@@{#1}{#2(#3)}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikz@timing@@@}[3]{Optional TikZ Keys}{Coordinate}{Timing % Characters} % \begin{macrocode} \def\tikz@timing@@@#1#2#3{% \begingroup \tikztiming@init \let\tikz@alias=\pgfutil@empty% \begin{scope}[shift={#2},timing,#1]% \@ifnextchar{[}% {\tikz@timing@@@init}% {\tikz@timing@@@init[]}% #3\relax \tikzset{timing/before}% \tikztiming@str;% \path let \p1 = (timing/end top), \p2 = (timing/end base), \p3 = (timing/end), \p4 = (timing/start) in [/utils/exec={% \xdef\tikztiming@northeast{\noexpand\pgfpoint{.5*\pgf@pt@aa*\x1}{.5*\pgf@pt@bb*\y1}}% \xdef\tikztiming@startpoint{\noexpand\pgfpoint{\pgf@pt@aa*(\x4-.5*\x1)}{\pgf@pt@bb*(\y4-.5*\y1)}}% \xdef\tikztiming@endpoint{\noexpand\pgfpoint{\pgf@pt@aa*(\x3-.5*\x1)}{\pgf@pt@bb*(\y3-.5*\y1)}}% }]; \node [shape=tikztiming@shape,anchor=origin,#1] at (0,0) {}; \tikzset{timing/after}% \end{scope}% \endgroup \tikz@timing@@@end } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikz@timing@@@end} % \begin{macrocode} \def\tikz@timing@@@end{% \@ifnextchar{;}% {\@gobble}% {\PackageError{tikz-package}{Can not parse timing path}{}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikz@timing@@@init}[1]{Initial character.} % Opens a group which will end in \cs{tikztiming@parser@end}. % \begin{macrocode} \def\tikz@timing@@@init[#1]{% \begingroup \ifx\relax#1\relax\else \uppercase{\def\tikztiming@lastchar{#1}}% \fi \@ifundefined{tikztiming@initcode@\tikztiming@lastchar}% {}% {\@nameuse{tikztiming@initcode@\tikztiming@lastchar}}% \if @\tikztiming@lastchar\relax\else \tikztiming@iftrans{@\tikztiming@lastchar}% {\tikztiming@nameaddtostr{@}{\tikztiming@lastchar}{}}% {\PackageWarning{tikz-timing}{Start value for timing character '\tikztiming@lastchar' is not defined and will be ignored!}{}{}{}}% \fi \tikztiming@parser } % \end{macrocode} % \end{macro} % % \section{Internal Macros} % % \begin{macro}{\tikztiming@trans@} % \begin{macrocode} \def\tikztiming@trans@#1#2#3#4{% \unexpanded\expandafter\expandafter\expandafter{% \csname\tikztiming@prefix #2#3#4\endcsname{#1}{#2}{#3}{#4} }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@beforenextcode@D@edge@} % \begin{macrocode} \def\tikztiming@beforenextcode@D@edge@{% \if D\tikztiming@currentchar\else \gdef\tikztiming@lastchar{D}% \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@beforenextcode@U@edge@} % \begin{macrocode} \def\tikztiming@beforenextcode@U@edge@{% \if U\tikztiming@currentchar\else \gdef\tikztiming@lastchar{U}% \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@initcode@} % If empty init char was given, exchange it with "@". % \begin{macrocode} \def\tikztiming@initcode@{% \gdef\tikztiming@lastchar{@}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@initcode@D} % \begin{macrocode} \def\tikztiming@initcode@D{% \gdef\tikztiming@lastchar{D@edge@}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@initcode@U} % \begin{macrocode} \def\tikztiming@initcode@U{% \gdef\tikztiming@lastchar{U@edge@}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@parser} % \begin{macrocode} \def\tikztiming@parser{% \@ifnextchar\relax {\tikztiming@parser@end}% {\tikztiming@testfornum}% } % \end{macrocode} % \end{macro} % % \section{Add-to-Macro Macros} % \begin{macro}{\tikztiming@eaddto}[2]{Macro name}{Tokens to add to macro} % \begin{macrocode} \def\tikztiming@eaddto#1#2{% \begingroup \tikztiming@internaldefs \@temptokena\expandafter{#1}% \xdef#1{% \the\@temptokena #2% }% \endgroup } % \end{macrocode} % \end{macro} % % \begin{macrocode} \iftrue % \end{macrocode} % % \begin{macro}{\tikztiming@initstr} % \begin{macrocode} \long\def\tikztiming@initstr{% \def\tikztiming@str } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@eaddtostr} % \begin{macrocode} \def\tikztiming@eaddtostr{% \tikztiming@eaddto\tikztiming@str } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@addtostr} % \begin{macrocode} \def\tikztiming@addtostr{% \g@addto@macro\tikztiming@str } % \end{macrocode} % \end{macro} % % \begin{macrocode} \else % \end{macrocode} % % \begin{macro}{\tikztiming@str} % \begin{macrocode} \def\tikztiming@file{\jobname.ttg} \newwrite\tikztiming@fh \def\tikztiming@str{% \tikztiming@addtostr{;}% \immediate\closeout\tikztiming@fh \begingroup \makeatletter \@@input\tikztiming@file\relax \endgroup \@ifnextchar;{\@gobble}{}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@initstr} % \begin{macrocode} \long\def\tikztiming@initstr{% \immediate\openout\tikztiming@fh= \tikztiming@file\relax \tikztiming@addtostr } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@eaddtostr} % \begin{macrocode} \long\def\tikztiming@eaddtostr#1{% \begingroup \tikztiming@internaldefs \let\par\empty \immediate\write\tikztiming@fh{#1}% \endgroup } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@addtostr} % \begin{macrocode} \long\def\tikztiming@addtostr#1{% \begingroup \tikztiming@internaldefs \let\par\empty \immediate\write\tikztiming@fh{\unexpanded{#1}}% \endgroup } % \end{macrocode} % \end{macro} % % \begin{macrocode} \fi % \end{macrocode} % % % \begin{macro}{\tikztiming@makeglobal} % \begin{macrocode} \def\tikztiming@makeglobal#1{% \global\let#1#1\relax\relax } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@iftrans}[1]{Characters} % \begin{macrocode} \def\tikztiming@trans{}% \def\tikztiming@iftrans#1{% \tikztiming@iftrans@#1\empty\empty\empty\relax } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@iftrans}[4] % {First character}{Second character} % {Next character or empty}{Eats token till end marker} % \begin{macrocode} \def\tikztiming@iftrans@#1#2#3#4\relax{% \begingroup \xdef\tikztiming@trans{#1#2}% \ifx\tikztiming@trans\empty \gdef\tikztiming@trans{{@}{}{@}}% \else \global\let\tikztiming@trans\relax % Use triple macros before double macros \@ifundefined{tikztiming@triple@#2}% {\@ifundefined{\tikztiming@prefix#1#2}% {}% {\xdef\tikztiming@trans{{#1}{#2}{}}}% }% {% \@ifundefined{\tikztiming@prefix#1#2#3}% {}% {\xdef\tikztiming@trans{{#1}{#2}{#3}}}% }% % If both do not exist, search for aliases: \ifx\tikztiming@trans\relax \@ifundefined{tikztiming@alias@#1}% {\edef\chara{{#1}}}% {\edef\chara{{#1},{\csname tikztiming@alias@#1\endcsname}}}% \@ifundefined{tikztiming@alias@#2}% {\edef\charb{{#2}}}% {\edef\charb{{#2},{\csname tikztiming@alias@#2\endcsname}}}% \@ifundefined{tikztiming@triple@#2}% {\def\charc{\empty}}% {% \@ifundefined{tikztiming@alias@#3}% {\edef\charc{{#3},}}% {\edef\charc{{#3},{\csname tikztiming@alias@#3\endcsname},}}% }% \ifx\charb\empty \def\charb{\empty}% \fi \let\tikztiming@next\relax \foreach \b in \charb {% \foreach \a in \chara {% \foreach \c in \charc {% %\message{ ^^J Testing: \a\b\c ^^J}% \@ifundefined{\tikztiming@prefix\a\b\c}% {}{% \xdef\tikztiming@trans{{#1}{#2}{#3}}% \expandafter\tikztimingcpy\expandafter {\tikztiming@trans}{\a\b\c}% \ifnum\tikztiming@debug>0 \message{^^J DEBUG: '#1#2#3' = '\a\b\c' ^^J}% \fi \expandafter\tikztiming@makeglobal \csname\tikztiming@pfxtr\tikztiming@trans\endcsname \ifnum\tikztiming@debug>1 \ifnum\tikztiming@debug>2 \expandafter\show\csname\tikztiming@pfxtr\tikztiming@trans\endcsname \else \message{^^J\tikztiming@trans: \expandafter\meaning\csname\tikztiming@pfxtr\tikztiming@trans\endcsname^^J}% \message{^^J\a\b\c: \expandafter\meaning\csname\tikztiming@prefix\a\b\c\endcsname^^J}% \fi \fi \global\let\tikztiming@next\breakforeach }% \tikztiming@next }% \tikztiming@next }% \tikztiming@next }% \fi \fi \endgroup \ifx\tikztiming@trans\relax \expandafter\@secondoftwo \else \expandafter\@firstoftwo \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@nameaddtostr} % {First character}{Second character} % {Optional next character} % \begin{macrocode} \def\tikztiming@nameaddtostr#1#2#3{% \tikztiming@iftrans{{#1}{#2}{#3}}% {% %\edef\@tempa{\noexpand\tikztiming@trans@{\tikztiming@num}\tikztiming@trans}% %\expandafter\tikztiming@addtostr %\expandafter{\@tempa}% \edef\@tempa{\noexpand\tikztiming@trans@{\tikztiming@num}\tikztiming@trans}% %\tikztiming@eaddtostr{\@percentchar\space {#1}{#2}{#3}}% \tikztiming@eaddtostr{\@tempa}% %\tikztiming@eaddtostr{\tikztiming@trans@{\tikztiming@num}\tikztiming@trans}% }% {\PackageWarning{tikz-timing}{No transitions '#1#2' (or '#1#2#3') defined!}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@output@addcode} % Adds code to the output code buffer. The code will not be expanded, i.e.\ will % be protected from the expansion when the buffer is flushed. % \begin{macrocode} \def\tikztiming@output@addcode#1{% \g@addto@macro\tikztiming@output@bufcode{\unexpanded{ #1 }}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@output@eaddcode} % Adds code to the output code buffer. The code will be expanded when the buffer % is flushed. % \begin{macrocode} \def\tikztiming@output@eaddcode#1{% \g@addto@macro\tikztiming@output@bufcode{ #1 }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@output@Eaddcode} % Adds code to the output code buffer. The code will be expanded immediately and % again when the buffer is flushed. % \begin{macrocode} \def\tikztiming@output@Eaddcode{% \tikztiming@eaddto\tikztiming@output@bufcode% } % \end{macrocode} % \end{macro} % % % \section{Output Routine} % % Init buffer macros: % \begin{macrocode} \def\tikztiming@output@bufchara{}% \def\tikztiming@output@bufcharb{}% \def\tikztiming@output@bufnum{0}% \def\tikztiming@output@bufcode{}% \def\tikztiming@output@nextchar{}% % \end{macrocode} % % \begin{macro}{\tikztiming@output}[2]{Character 1}{Character 2} % \begin{macrocode} \def\tikztiming@output#1#2{% \edef\tikztiming@fromchar{#1}% \edef\tikztiming@tochar{#2}% \ifx\relax#2\relax %\tikztiming@output@codeflush \tikztiming@nameaddtostr{}{#1}{}% \else \ifcase0% \ifx\tikztiming@output@bufchara\empty \ifx\tikztiming@output@bufcharb\empty 1% \fi \fi\relax % not empty \edef\tikztiming@output@currentchar{#2}% \ifcase0% \ifx\tikztiming@output@bufcode\empty% Stop combining if code was inserted \expandafter\ifx\csname tikztiming@nocombine@#2\endcsname\relax \ifx\tikztiming@output@currentchar\tikztiming@output@bufcharb 2% \fi \fi \else 1% \fi \relax \edef\tikztiming@output@nextchar{#2}% \tikztiming@output@flush \xdef\tikztiming@output@bufchara{#1}% \xdef\tikztiming@output@bufcharb{#2}% \or \edef\tikztiming@output@nextchar{#2}% \tikztiming@output@flush \xdef\tikztiming@output@bufchara{#1}% \xdef\tikztiming@output@bufcharb{#2}% \or \pgfmathparse{\tikztiming@output@bufnum + \tikztiming@num}% \global\let\tikztiming@output@bufnum\pgfmathresult \fi \else % empty \tikztiming@output@codeflush \xdef\tikztiming@output@bufchara{#1}% \xdef\tikztiming@output@bufcharb{#2}% \global\let\tikztiming@output@bufnum\tikztiming@num \fi \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@output@flush} % \begin{macrocode} \def\tikztiming@output@flush{% \tikztiming@output@charflush \tikztiming@output@codeflush } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@output@codeflush} % \begin{macrocode} \def\tikztiming@output@codeflush{% \ifx\tikztiming@output@bufcode\empty\else \tikztiming@eaddtostr{\tikztiming@output@bufcode}% \global\let\tikztiming@output@bufcode\empty% \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@output@charflush} % A group is used to protect the current value of |num| which is the length of % the new character after the flushed old character. This value will be assigned % to the new buffer length |bufnum|. % \begin{macrocode} \def\tikztiming@output@charflush{% \begingroup \let\tikztiming@num\tikztiming@output@bufnum \tikztiming@nameaddtostr {\tikztiming@output@bufchara}% {\tikztiming@output@bufcharb}% {\tikztiming@output@nextchar}% \endgroup% \gdef\tikztiming@output@nextchar{}% \gdef\tikztiming@output@bufchara{}% \gdef\tikztiming@output@bufcharb{}% \global\let\tikztiming@output@bufnum\tikztiming@num } % \end{macrocode} % \end{macro} % % % \section{Macros for Character Definitions} % % \begin{macro}{\tikztiming@nameedef}[4]{Macro name to be defined (without % prefix)}{Content of macro} % Defines internal tikztiming macro with name |\|\meta{prefix}\meta{name (\#2)}. % The macro definition (\#3) is expanded while the internal drawing definitions % are active. % \begin{macrocode} \newcommand\tikztiming@nameedef[4]{% \def\@gtempa##1{#4}% \begingroup \tikztiming@internaldefs \xdef\@gtempa##1##2##3##4{\@gtempa{\width}}% \endgroup \expandafter\let\csname\tikztiming@prefix#1#2#3\endcsname\@gtempa \let\@gtempa\empty } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@namelet}[2]{Original Characters}{New Characters} % Only execute |\let| if the original macro is defined or the destination macro % is defined and would now set to undefined. % \begin{macrocode} \newcommand\tikztiming@namelet[2]{% \ifcase0% \@ifundefined{\tikztiming@prefix#2}% {\@ifundefined{\tikztiming@prefix#1}% {0}{1}% }% {1}% \relax \else \expandafter\let \csname\tikztiming@prefix#1\expandafter\endcsname \csname\tikztiming@prefix#2\endcsname \fi } % \end{macrocode} % \end{macro} % % % \section{Parser} % % \begin{macro}{\tikztiming@parser@end} % \begin{macrocode} \def\tikztiming@parser@end{% \def\tikztiming@output@nextchar{@}% \let\tikztiming@fromchar\tikztiming@tochar \edef\tikztiming@tochar{@}% \tikztiming@output@flush \global\let\tikztimingwidth\tikztimingwidth \tikztiming@addtostr{ coordinate (timing/end) let \p1 = (timing/start base), \p2 = (timing/end), \p3 = (0,1) in coordinate (timing/end base) at (\x2,\y1) coordinate (timing/end top) at (\x2,\y1+\y3) }% \endgroup \tikztiming@endhook% } \let\tikztiming@endhook\relax % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@parser@}[1]{Next Character} % \begin{macrocode} \def\tikztiming@parser@#1{% \ifx\relax#1\empty \expandafter\tikztiming@parser@end \else \tikztiming@iflower{#1}% {\tikztiming@setnum{\tikztiming@num/2}}% {}% \ifx\tikztiming@back\empty\else \tikztiming@setnum{\tikztiming@num - \tikztiming@back}% \global\let\tikztiming@back\empty \fi \pgfmathparse{\tikztimingwidth + \tikztiming@num}% \global\let\tikztimingwidth\pgfmathresult \uppercase{\gdef\tikztiming@currentchar{#1}}% \@nameuse{tikztiming@beforenextcode@\tikztiming@lastchar}% \@nameuse{tikztiming@beforecode@\tikztiming@currentchar}% \tikztiming@output{\tikztiming@lastchar}{\tikztiming@currentchar}% \global\let\tikztiming@lastchar\tikztiming@currentchar \@nameuse{tikztiming@aftercode@\tikztiming@currentchar}% \expandafter\lowercase\expandafter{% \expandafter\def\expandafter\@tempa \expandafter{\tikztiming@currentchar}% }% \pgfkeysifdefined{/tikz/timing/\@tempa/text/.@cmd}% {\expandafter\expandafter\expandafter\tikztiming@testfortext}% {\expandafter\expandafter\expandafter\tikztiming@parser}% \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@testfortext} % \begin{macrocode} \def\tikztiming@testfortext{% \@ifnextchar\bgroup {\tikztiming@handletext}% {\tikztiming@parser}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@handletext}[1]{Text} % Looks ahead if the current character is the last one and sets the end-of-line % marker if so. % % This seems outdated because |handletext@| does not flush the output any more. % \begin{macrocode} \def\tikztiming@handletext#1{% \@ifnextchar\relax {\def\tikztiming@output@nextchar{@}\tikztiming@handletext@{#1}}% {\def\tikztiming@output@nextchar{Z}\tikztiming@handletext@{#1}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@handletext@}[1]{Text} % \begin{macrocode} \def\tikztiming@handletext@#1{% \@ifnextchar{[}% {\tikztiming@handletext@@}% {\tikztiming@handletext@@[]}% #1\tikztiming@endoftext } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@handletext@@}[2]{Optional Settings}{Text} % \begin{macrocode} \def\tikztiming@handletext@@[#1]#2\tikztiming@endoftext{% \@ifnextchar{\relax}% {\def\tikztiming@output@nextchar{@}% \tikztiming@handletext@@@{#1}{#2}}% {\tikztiming@handletext@@@{#1}{#2}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@handletext@@@}[2]{Optional Settings} % {Text} % \begin{macrocode} \def\tikztiming@handletext@@@#1#2{% \expandafter\lowercase\expandafter{% \expandafter\def\expandafter\@tempa \expandafter{\tikztiming@currentchar}% }% \edef\@tempa{node [timing/\@tempa/text,}% \expandafter\tikztiming@output@addcode\expandafter{% \@tempa #1] at ($ (timing@dstart) !.5! (timing@dend) $) {\tikztiming@textformat{#2}} }% \ifcase0% \if @\tikztiming@output@bufchara 1% \else \ifx\tikztiming@output@bufchara\tikztiming@currentchar 1% \fi \fi \relax \else \fi \xdef\tikztiming@output@bufcharb{\tikztiming@currentchar @edge@}% \xdef\tikztiming@lastchar{\tikztiming@currentchar @edge@}% \tikztiming@parser } \let\tikztiming@textformat\empty % \end{macrocode} % \end{macro} % % \section{Definition of Modifiers} % % \begin{macro}{\tikztiming@defcode}[1]{Code Character} % \begin{macrocode} \def\tikztiming@defcode#1{% \@namedef{tikztiming@code@\meaning#1}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@defcode{@}} % Simply executes given code. The |\relax| is added to have some protection % against user code manipulating the parser macro. The "@" character can be both % a letter (in style files) and a character (in user documents), so it is % defined twice. % \begin{macrocode} \tikztiming@defcode{@}#1{% #1\relax \tikztiming@parser } \begingroup \expandafter\let\expandafter\temp \csname tikztiming@code@\meaning @\endcsname \makeatother \expandafter\global\expandafter\let \csname tikztiming@code@\meaning @\endcsname\temp \endgroup % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@defcode{DOLLAR}} % Takes the code between two dollar signs and parses it as math expression. The % result is put back on the input stream. This allows the calculation of % character width. % \begin{macrocode} \tikztiming@defcode$#1${% \pgfmathparse{#1}% \expandafter \tikztiming@parser\pgfmathresult } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@defcode{,}} % \begin{macrocode} \tikztiming@defcode{,}{% \tikztiming@output@eaddcode{% \newdraw [timing/every char] }% \tikztiming@parser } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@defcode{;}} % \begin{macrocode} \tikztiming@defcode{;}{% \endgroup\begingroup \tikztiming@output@eaddcode{% \newdrawns [timing/every char] }% \tikztiming@parser } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@defcode{N}} % \begin{macrocode} \tikztiming@defcode{N}{% \@ifnextchar[%] {\tikztiming@addnode@getoptions}% {\tikztiming@addnode@getoptions[]}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@defcode{n}} % \begin{macrocode} \tikztiming@defcode{n}{% \@ifnextchar[%] {\tikztiming@addnode@getoptions}% {\tikztiming@addnode@getoptions[]}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@defcode{B}} % \begin{macrocode} \tikztiming@defcode{B}{% \pgfmathparse{\tikztiming@back+\tikztiming@num}% \global\let\tikztiming@back\pgfmathresult \tikztiming@parser } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@defcode{b}} % \begin{macrocode} \tikztiming@defcode{b}{% \pgfmathparse{\tikztiming@back+\tikztiming@num/2}% \global\let\tikztiming@back\pgfmathresult \tikztiming@parser } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@defcode{F}} % \begin{macrocode} \tikztiming@defcode{F}{% \pgfmathparse{\tikztiming@back-\tikztiming@num}% \global\let\tikztiming@back\pgfmathresult \tikztiming@parser } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@defcode{f}} % \begin{macrocode} \tikztiming@defcode{f}{% \pgfmathparse{\tikztiming@back-\tikztiming@num/2}% \global\let\tikztiming@back\pgfmathresult \tikztiming@parser } % \end{macrocode} % \end{macro} % % % \begin{macro}{\tikztiming@defcode []}[1]{Options} % Single brackets are in-picture options. % Brackets and a "!" sign "[! !]" are parser options. % Double brackets are both. % % Brackets and "| |" signs "[| |]" are only-once in-picture options. % \begin{macrocode} \tikztiming@defcode[{%}]{ \@ifnextchar[%] {\tikztiming@bothoption}% {\@ifnextchar{!}% {\tikztiming@parseroption}% {\@ifnextchar{|}% {\tikztiming@onceoption}% {\tikztiming@addoption}% }% }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@parseroption}[1]{Options} % Sets the given options immediately, so that they are in affect for the rest of % the parser run. % \begin{macrocode} \def\tikztiming@parseroption!#1!]{% \pgfqkeys{/tikz/timing}{#1}% \tikztiming@parser } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@addoption}[1]{Options} % Adds the options to the internal list of timing options. % \begin{macrocode} \def\tikztiming@addoption#1]{% \tikztiming@output@addcode{ [timing/option={#1}] }% \tikztiming@parser } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@bothoption}[1]{Options} % Does executes and adds the options to the output code buffer. This is % necessary for slopes if they are used in width calculations. % \begin{macrocode} \def\tikztiming@bothoption[#1]]{% \tikzset{#1}%[ \tikztiming@addoption{#1}]% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@onceoption}[1]{Options} % Simply adds the options to the output code buffer. % \begin{macrocode} \def\tikztiming@onceoption|#1|]{% \tikztiming@output@addcode{ [#1] }% \tikztiming@parser } % \end{macrocode} % \end{macro} % % % \subsection{Local Scopes, Push/Pop Options} % % \begin{macro}{\tikztiming@defcode bgroup} % \begin{macrocode} \tikztiming@defcode{\bgroup}{% \tikztiming@output@eaddcode{% [timing/pushoptions] \newdraw [timing/every char] }% \tikztiming@parser } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@defcode egroup} % \begin{macrocode} \tikztiming@defcode{\egroup}{% \tikztiming@output@eaddcode{% [timing/popoptions] \newdraw [timing/every char] }% \tikztiming@parser } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@popoptions} % \begin{macrocode} \def\tikztiming@popoptions{% \expandafter\tikztiming@popoptions@\tikztiming@optionstack\relax } \def\tikztiming@optionstack{{}} % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@popoptions@} % \begin{macrocode} \def\tikztiming@popoptions@#1#2\relax{% \gdef\tikztiming@saved@options{#1}% \gdef\tikztiming@optionstack{#2}% \ifx\tikztiming@optionstack\empty \gdef\tikztiming@optionstack{{}}% \fi } % \end{macrocode} % \end{macro} % % % \begin{macro}{\tikztiming@pushoptions} % \begin{macrocode} \def\tikztiming@pushoptions{% \expandafter\expandafter\expandafter\gdef \expandafter\expandafter\expandafter\tikztiming@optionstack \expandafter\expandafter\expandafter{% \expandafter\expandafter\expandafter{\expandafter\tikztiming@saved@options\expandafter}\tikztiming@optionstack}% } % \end{macrocode} % \end{macro} % % % \subsection{Add-Node Macros} % % \begin{macro}{\tikztiming@addnode}[1]{Options} % \begin{macrocode} \def\tikztiming@addnode@getoptions[#1]{% \@ifnextchar(%) {\tikztiming@addnode@getname{#1}}% {\tikztiming@addnode@getname{#1}()}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@addnode@getname}[2]{Previous read options}{Node name} % \begin{macrocode} \def\tikztiming@addnode@getname#1(#2){% \@ifnextchar\bgroup {\tikztiming@addnode@{#1}{#2}}% {\tikztiming@addnode@{#1}{#2}{}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@addnode@}[3]{Options}{Node name}{Node text} % The |fromchar| and |tochar| macros are to be expanded in the output routine, % not inside this macro. They do not hold the correct values yet. % \begin{macrocode} \def\tikztiming@addnode@#1#2#3{% \def\@tempa{#2}% \ifx\@tempa\empty \def\@tempa{ node [timing/inline node,% timing/inline node/from char={\tikztiming@fromchar},% timing/inline node/to char={\tikztiming@tochar},% \unexpanded{#1}] }% \def\@tempb{}% \else \def\@tempa{ node [timing/inline node,% timing/inline node/from char={\tikztiming@fromchar},% timing/inline node/to char={\tikztiming@tochar},% \unexpanded{#1}] (\unexpanded{#2}) }% \xdef\tikztiming@namednodes{\tikztiming@namednodes,#2}% \fi \expandafter\tikztiming@output@eaddcode\expandafter{\@tempa \unexpanded{{#3}}}% \tikztiming@parser } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@marknodes}[1]{Comma-separated list of node names} % \begin{macrocode} \newcommand*\tikztiming@marknodes[2][]{% \scope[timing/debug/scope,#1] \edef\@tempa{floor((\noexpand\y1-\tikztiming@xunit) / \tikztiming@rowdist\tikztiming@xunit) * \tikztiming@rowdist\tikztiming@xunit}% \foreach \N in #2 {% \ifx\N\empty\else \tikztiming@markcmd \path let \p1=(\N) in node [timing/debug/node] at ($ (\x1,\noexpand\@tempa) + (0,1) $) {\N}; \fi }% \endscope } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@markcmd} % \begin{macrocode} \def\tikztiming@markcmd{ \draw (\N) circle (1pt); }% % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@mark@nodes}[1]{Comma-separated list of node names} % \begin{macrocode} \newcommand*\tikztiming@mark@nodes[2][]{% \begingroup \def\@tempa{#2}% \ifx\@tempa\empty \let\@tempa\tikztiming@namednodes \fi \ifx\@tempa\space \let\@tempa\tikztiming@namednodes \fi \def\@tempb{\tikztiming@marknodes[#1]}% \expandafter\@tempb\expandafter{\expandafter{\@tempa}}% \endgroup } % \end{macrocode} % \end{macro} % % \subsection{Test for Code (`!' modifier)} % % \begin{macro}{\tikztiming@testforcode} % \begin{macrocode} \def\tikztiming@testforcode{% \@ifnextchar{!}% {\tikztiming@testforcode@}% {\@ifundefined{tikztiming@code@\meaning\@let@token}% {\tikztiming@parser@}% {\expandafter\afterassignment \csname tikztiming@code@\meaning\@let@token\endcsname \let\@let@token=% }% }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@testforcode@}[1]{Character to gobble} % \begin{macrocode} \def\tikztiming@testforcode@#1{% \@ifnextchar\bgroup {\tikztiming@handlecode}% {% \PackageWarning{tikz-timing}{Missing braces after '!' character. Ignoring this character}{}{}{}% \tikztiming@parser }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@handlecode}[1]{Code to add to string} % \begin{macrocode} \def\tikztiming@handlecode#1{% \tikztiming@output@addcode{ #1 }% \tikztiming@parser } % \end{macrocode} % \end{macro} % % % \section{Parser Macros: Numbers} % % \begin{macro}{\tikztiming@testfornum} % \begin{macrocode} \def\tikztiming@testfornum{% \global\let\tikztiming@num\tikztiming@wscale \let\tikztiming@numchars\empty \tikztiming@numfrac0\relax \afterassignment \tikztiming@testfornum@ \tikztiming@numint0% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@testfornumfrac} % \begin{macrocode} \def\tikztiming@testfornumfrac{% \afterassignment \tikztiming@testfornum@@@ \tikztiming@numfrac1% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@numloop} % \begin{macrocode} \def\tikztiming@numloop{% \ifnum\tikztiming@numint>0% \toks@\expandafter{\tikztiming@numchars}% \xdef\tikztiming@numchars{% \the\toks@ \the\@temptokena }% \advance\tikztiming@numint by -1\relax \expandafter\tikztiming@numloop \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@testfornum@} % The \cs{@let@token} set in \cs{tikztiming@parser} is used to handle "0" % which can not be detected using the \cs{tikztiming@numint} value. % \begin{macrocode} \def\tikztiming@testfornum@{% \ifx0\@let@token \let\tikztiming@next\tikztiming@testfornum@@ \else \ifnum0<\tikztiming@numint \let\tikztiming@next\tikztiming@testfornum@@ \else \def\tikztiming@next{% \@ifnextchar{.}% {\expandafter\tikztiming@testfornumfrac\@gobble}% {% \tikztiming@numint1\relax \tikztiming@numfrac0\relax \global\let\tikztiming@num\tikztiming@wscale \if@tikztiming@metachar {\def\@tempa{\expandafter\expandafter\expandafter \tikztiming@parser \csname tikztiming@metachar@\meaning\@let@token\endcsname{1}}% \expandafter\@tempa\@gobble }% {\tikztiming@testforcode}% }% }% \fi\fi \tikztiming@next } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@testfornum@@} % \begin{macrocode} \def\tikztiming@testfornum@@{% \@ifnextchar{.}% {\expandafter\tikztiming@testfornumfrac\@gobble}% {\tikztiming@testfornum@@@}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@testfornum@@@} % \begin{macrocode} \def\tikztiming@testfornum@@@{% \edef\tikztiming@num{\the\tikztiming@numint.\expandafter\@gobble\the\tikztiming@numfrac}% \tikztiming@setnum{\tikztiming@wscale * \tikztiming@num}% \@ifnextchar\bgroup {% \expandafter\tikztiming@numfrac\expandafter0\expandafter \@gobble\the\tikztiming@numfrac\relax \ifnum0=\tikztiming@numfrac\else \pgfmathparse{round(\tikztiming@num)}% \PackageWarning{tikz-timing}% {Can not repeat group by a non-integer factor!^^J% Rounding '\tikztiming@num' to '\pgfmathresult'.}{}{}{}% \global\let\tikztiming@num\pgfmathresult \fi \tikztiming@testfornum@@@@ }% {% \if@tikztiming@metachar {\def\@tempa{\expandafter\expandafter\expandafter \tikztiming@parser \csname tikztiming@metachar@\meaning\@let@token\expandafter\endcsname \expandafter{\tikztiming@num}}% \expandafter\@tempa\@gobble }% {\tikztiming@testforcode}% }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@testfornum@@@@}[1]{Characters and other tokens to % repeat} % \begin{macrocode} \def\tikztiming@testfornum@@@@#1{% \begingroup \@temptokena{#1}% \tikztiming@numloop% \endgroup \tikztiming@numint1\relax \tikztiming@numfrac0\relax \expandafter\tikztiming@parser\tikztiming@numchars } % \end{macrocode} % \end{macro} % % \section{Meta-Characters} % % \begin{macro}{\tikztimingmetachar}[1]{Meta-character} % Checks if there is an optional argument and calls \cs{tikztiming@metachar} % appropriately. % \begin{macrocode} \def\tikztimingmetachar#1{% \@ifnextchar{[}%] {\tikztiming@metachar{#1}}% {\tikztiming@metachar{#1}[]}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@metachar}[3]{Macro character}{Number of % Arguments}{Substituted Characters} % \begin{macrocode} \def\tikztiming@metachar#1[#2]#3{% \ifx\relax#3\relax \expandafter\let\csname tikztiming@metachar@\meaning#1\endcsname\@undefined \else \@namedef{tikztiming@metachar@\meaning#1}{}% \ifx\relax#2\relax \expandafter\renewcommand\expandafter*% \csname tikztiming@metachar@\meaning#1\expandafter \endcsname\expandafter[1]{##1{#3}}% \else \expandafter\renewcommand\expandafter*% \csname tikztiming@metachar@\meaning#1\expandafter \endcsname\expandafter[#2]{#3}% \fi \fi \ifnum\tikztiming@debug=-1 \message{^^J Defined meta-char '#1' as: \expandafter\meaning\csname tikztiming@metachar@\meaning#1\endcsname ^^J}% \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\if@tikztiming@metachar}[2]{True clause}{False clause} % Only works in an argument of |\@ifnextchar|. This macro sets the needed % |\@let@token| macro. % \begin{macrocode} \def\if@tikztiming@metachar#1#2{% \@ifundefined{tikztiming@metachar@\meaning\@let@token}{#2}{#1}% } % \end{macrocode} % \end{macro} % % \section{Table environment} % \begin{macrocode} %\usetikzlibrary{backgrounds} \newcounter{tikztimingrows} % \end{macrocode} % % \begin{environment}{tikztimingtable}[1]{Optional settings} % \begin{macrocode} \def\abc{\tracingassigns=1} \newenvironment{tikztimingtable}[1][]{% \begingroup \setcounter{tikztiming@nrows}{0}% \def\tikztiming@maxwidth{0.0}% \let\extracode\tikztiming@extracode \let\endextracode\tikztiming@endextracode \let\tablegrid\tikztiming@tablegrid \let\fulltablegrid\tikztiming@fulltablegrid \let\horlines\tikztiming@horlines \let\vertlines\tikztiming@vertlines \let\marknodes\tikztiming@mark@nodes \def\background{\pgfonlayer{background}\scope}% \def\endbackground{\endscope\endpgfonlayer}% \def\tablerules{\tikztiming@tablerules}% \def\tableheader{\tikztiming@tableheader}% \def\rowdist{\tikztiming@rowdist}% \def\coldist{\tikztiming@coldist}% \def\nrows{\the\c@tikztiming@nrows}% \def\twidth{\tikztiming@maxwidth}% \tikzpicture[timing/table,#1]% \coordinate (@last row) at (0,\rowdist); \coordinate (label@header) at ($ -1*(\tikztiming@coldist,0) + 1.5*(0,\tikztiming@rowdist) $); \coordinate (diagram@header) at ($ 1.5*(0,\tikztiming@rowdist) $); \coordinate (timing@table@bottom right) at (0,0); \coordinate (timing@table@bottom left) at ($ -1*(\tikztiming@coldist,0) $); \tikztiming@picinit \tikzset{timing/before table}% \tikztimingtable@checkrow }{% \tikzset{timing/after table}% \endtikzpicture \endgroup } % \end{macrocode} % \end{environment} % % \begin{macro}{\tikztiming@extracode} % Set "all rows" rectangle node using the auxiliary coordinates. % \begin{macrocode} \def\tikztiming@extracode{% \path let \p1 = (row1.north west), \p2 = (timing@table@bottom right), \p3 = (\x2-\x1,\y1-\y2), \p4 = (\pgf@pt@aa * \x3, \pgf@pt@bb * \y3) in node [shape=rectangle,anchor=north west, minimum width=\x4,minimum height=\y4, inner sep=0pt,outer sep=0pt] at (\x1,\y1) (all rows) {} ; \path let \p0 = ($ -1*(\tikztiming@coldist,0) + (0,1) $), \p1 = (label1.north east), \p2 = (timing@table@bottom left), \p3 = (\x0-\x2,\y1-\y2), \p4 = (\pgf@pt@aa * \x3, \pgf@pt@bb * \y3) in node [shape=rectangle,anchor=north east, minimum width=\x4,minimum height=\y4, inner sep=0pt,outer sep=0pt] at (\x1,\y1) (all labels) {} ; \@ifnextchar[{\tikztiming@oset}{}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@endextracode} % Now empty because \cs{tikztimingtable@chkendec} handles the % continuation of the row scanning process. % \begin{macrocode} \def\tikztiming@endextracode{% }% % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztimingtable@checkrow} % Checks the next token to be either \cs{end}, \cs{extracode} or % \cs{begin}. In the case of the latter \cs{tikztimingtable@chkbegec} % is called to test if it is \cs{begin}|{extracode}|. % \begin{macrocode} \def\tikztimingtable@checkrow{% \@ifnextchar\end {\tikztimingtable@chkendec}% {\ifx\@let@token\extracode \let\tikztiming@next\empty \else \ifx\@let@token\begin \def\tikztiming@next{\tikztimingtable@chkbegec}% \else \def\tikztiming@next{\tikztimingtable@row}% \fi \fi \tikztiming@next }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztimingtable@chkbegec} % Checks if value of \cs{begin} is |{extracode}|. If so % it is executed, otherwise it is taken as normal row and so % \cs{tikztimingtable@row} is called. % \begin{macrocode} \def\tikztimingtable@chkbegec\begin#1{ \begingroup \def\@tempa{#1}% \def\@tempb{extracode}% \ifx\@tempa\@tempb \endgroup \def\tikztiming@next{\begin{extracode}}% \else \endgroup \def\tikztiming@next{\tikztimingtable@row\begin{#1}}% \fi \tikztiming@next } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztimingtable@chkendec} % Checks if value of \cs{end} is |{extracode}|. If so % it is executed, otherwise it is taken as normal row and so % \cs{tikztimingtable@row} is called. % \begin{macrocode} \def\tikztimingtable@chkendec\end#1{ \begingroup \def\@tempa{#1}% \def\@tempb{extracode}% \ifx\@tempa\@tempb \endgroup \def\tikztiming@next{\end{extracode}\tikztimingtable@row}% \else \endgroup \def\tikztiming@next{\end{#1}}% \fi \tikztiming@next } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@oset} % [1]{TikZ Keys} % Handle optional TikZ settings. The \cs{tikz@options} must be used % to ensure that the settings apply for the following graphic paths. % \begin{macrocode} \def\tikztiming@oset[#1]{% \let\tikz@options\pgfutil@empty \tikzset{#1}% \tikz@options } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@emptycell} % Just used as marker. Needs unique definition. % \begin{macrocode} \def\tikztiming@emptycell{% \@gobble{tikztiming@emptycell}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztimingtable@row}[1]{Row content} % \begin{macrocode} \long\def\tikztimingtable@row#1\\{% \tikztimingtable@row@#1&\tikztiming@emptycell&\\ } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztimingtable@row@}[3]{Cell 1}{Cell 2 or empty}{Potential % further cells} % \begin{macrocode} \long\def\tikztimingtable@row@#1\\{% \ifx\\#3\\\else \begingroup \def\@tempa{\tikztiming@emptycell&}% \def\@tempb{#3}% \ifx\@tempa\@tempb\else \PackageWarning{tikz-timing}{% To many columns in tikztimingtable row! Only two are allowed% }{}{}{}% \fi \endgroup \fi \ifx\tikztiming@emptycell#2% \def\tikztiming@next{\tikztimingtable@row@@{#1}{}}% \else \def\tikztiming@next{\tikztimingtable@row@@{#1}{#2}}% \fi \tikztiming@next }% % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztimingtable@row@@}[2]{Name/Label}{Timing characters} % \begin{macrocode} \long\def\tikztimingtable@row@@#1#2{% \addtocounter{tikztiming@nrows}{1}% \coordinate (@last row) at ($ (@last row) - (0,\tikztiming@rowdist) $); \node [anchor=base east,timing/name,alias=last label] (label\the\c@tikztiming@nrows) at ($ (@last row) - (\tikztiming@coldist,0) $) {\ignorespaces #1\unskip\strut}; \path let \p1 = (timing@table@bottom left), \p2 = (last label.south west) in coordinate (timing@table@bottom left) at ({min(\x1,\x2)},\y2); % \@ifnextchar{[}% {\tikztiming@tabletiming}% {\tikztiming@tabletiming[]}% #2\relax \path let \p1 = (timing@table@bottom right), \p2 = (timing/end base) in coordinate (timing@table@bottom right) at ({max(\x1,\x2)},\y2); % \pgfmathparse{max(\tikztiming@maxwidth,\tikztimingwidth)}% \let\tikztiming@maxwidth\pgfmathresult \tikztimingtable@checkrow } % \end{macrocode} % \end{macro} % \begin{macro}{\tikztiming@tabletiming} % \begin{macrocode} \def\tikztiming@tabletiming[#1]#2\relax{% \let\tikztiming@lastchar\empty \let\tikztiming@settings\empty \ifx\relax#1\relax\else \tikztiming@testoptarg#1\relax\relax \fi \ifx\tikztiming@lastchar\empty \def\tikztiming@lastchar{@}% \fi \edef\@tempa{\noexpand\timing [name=row\the\c@tikztiming@nrows,alias=last row,% \expandafter\unexpanded\expandafter{\tikztiming@settings}] at (@last row)}% \expandafter\@tempa\expandafter{\expandafter[\tikztiming@lastchar]#2}; } % \end{macrocode} % \end{macro} % \begin{macro}{\tikztiming@fulltablegrid}[1]{Optional settings} % \begin{macrocode} \newcommand*\tikztiming@fulltablegrid[1][]{% \begin{pgfonlayer}{background} \scope[xstep={\timingwidth/2.},ystep={\timingheight/2.}, shift={(all rows.south west)},timing/table/grid,#1] \draw (0,0) grid ($ (all rows.north east) - (all rows.south west) $); \endscope \end{pgfonlayer} } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@tablegrid}[1]{Optional settings} % \begin{macrocode} \def\tikztiming@tablegrid{% \@ifnextchar{*}% {\tikztiming@tablegrid@{row\row.high end}}% {\tikztiming@tablegrid@{all rows.north east}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@tablegrid@@}[2]{Optional settings}{End point} % \begin{macrocode} \def\tikztiming@tablegrid@#1{% \@ifnextchar{[}%] {\tikztiming@tablegrid@@{#1}}% {\tikztiming@tablegrid@@{#1}[]}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@tablegrid@@}[2]{Optional settings}{End point} % \begin{macrocode} \def\tikztiming@tablegrid@@#1[#2]{% \begin{pgfonlayer}{background} \scope[xstep={\timingwidth/2.},ystep={\timingheight/2.},timing/table/grid,#2] \foreach \row in {1,...,\nrows} {% \draw {[shift={(row\row.low start)}] let \p1 = (#1) in (0,0) grid (\x1,1)}; }% \endscope \end{pgfonlayer} } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@tableheader} % [3]{Optional Settings}{Text title}{Diagram title} % \begin{macrocode} \def\tikztiming@tableheader{% \@ifnextchar[%] {\tikztiming@tableheader@}% {\tikztiming@tableheader@@{}[]}% } \def\tikztiming@tableheader@[#1]{% \@ifnextchar[%] {\tikztiming@tableheader@@{#1}}% {\tikztiming@tableheader@@{#1}[]}% } \def\tikztiming@tableheader@@#1[#2]#3{% \@ifnextchar[%] {\tikztiming@tableheader@@@{#1}{#2}{#3}}% {\tikztiming@tableheader@@@{#1}{#2}{#3}[]}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@tableheader} % [5]{Optional settings}{Optional label@header Settings}{Label title}{Optional Diagram title settings}{Diagram title} % \begin{macrocode} \def\tikztiming@tableheader@@@#1#2#3[#4]#5{% \path let \p1 = (label@header), \p2 = (all labels.east), \p3 = (all labels.west) in (\x2,\y1) -- node [pos=0,anchor=base east,timing/table/header,timing/table/label header,#1,#2] (label header) {\ignorespaces #3\unskip\strut} (\x3,\y1) ; \path let \p4 = (diagram@header), \p5 = (all rows.west), \p6 = (all rows.east) in (\x5,\y4) -- node [pos=0,anchor=base west,timing/table/header,timing/table/row header,#1,#4] (row header) {\ignorespaces #5\unskip\strut} (\x6,\y4) ; \tikztiming@tableheadtrue } \newif\iftikztiming@tablehead % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@tablerules}[1]{Optional Settings} % \begin{macrocode} \newcommand*\tikztiming@tablerules[1][]{% \begin{scope}[#1] \coordinate (NW) at (current bounding box.north west); \coordinate (SE) at (current bounding box.south east); % \draw [timing/table/rules] let \p1 = (NW), \p2 = (SE), \p3 = (@last row), \p4 = (0,\rowdist) in ($ (\x1-\tabcolsep,\y3) - (0,.5*\y4) $) -- ($ (\x2+\tabcolsep,\y3) - (0,.5*\y4) $) \iftikztiming@tablehead (\x1-\tabcolsep,2.5*\y4) -- (\x2+\tabcolsep,2.5*\y4) \fi ; \draw \iftikztiming@tablehead [timing/table/midrules] \else [timing/table/rules] \fi let \p1 = (NW), \p2 = (SE) in (\x1-\tabcolsep,\rowdist) -- (\x2+\tabcolsep,\rowdist) ; \end{scope} } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@horlines}[2]{Optional Settings}{Row numbers} % \begin{macrocode} \newcommand*\tikztiming@horlines[2][]{% \begingroup \def\list{#2}% \ifx\list\empty \def\list{1,2,...,\nrows}% \fi \foreach \row in \list {% \draw [timing/table/lines,#1] let \p1 = (all rows.south east), \p2 = (0,\rowdist) in ($ (0,\y2) - (0,\row * \y2) $) -- +(\x1,0); }% \endgroup } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@vertlines}[2]{Optional Settings}{Column numbers} % \begin{macrocode} \newcommand*\tikztiming@vertlines[2][]{% \begingroup \def\list{#2}% \ifx\list\empty \def\list{0,1,...,\twidth}% \fi \draw [timing/table/lines,#1] let \p1 = ($ (all rows.south east) - (0,2) $) in \foreach \clk in \list { (\clk,+1.5) -- +(0,\y1) } ; \endgroup } % \end{macrocode} % \end{macro} % % \section{Shapes} % \begin{macrocode} \pgfdeclareshape{tikztiming@shape}{% \savedanchor\northeast{\tikztiming@northeast}% \savedanchor\startpoint{\tikztiming@startpoint}% \savedanchor\endpoint{\tikztiming@endpoint}% \anchor{center}{\pgfpointorigin}% \anchor{start}{\startpoint}% \anchor{end}{\endpoint}% % \anchor{origin}{\northeast \pgf@x=-\pgf@x \pgf@y=-\pgf@y }% \anchor{east}{\northeast \pgf@y=0pt }% \anchor{west}{\northeast \pgf@y=0pt \pgf@x=-\pgf@x }% \anchor{north}{\northeast \pgf@x=0pt }% \anchor{north west}{\northeast \pgf@x=-\pgf@x }% \anchor{north east}{\northeast} \anchor{high mid}{\northeast \pgf@x=0pt }% \anchor{high start}{\northeast \pgf@x=-\pgf@x }% \anchor{high end}{\northeast} \anchor{south}{\northeast \pgf@x=0pt \pgf@y=-\pgf@y }% \anchor{south west}{\northeast \pgf@x=-\pgf@x \pgf@y=-\pgf@y }% \anchor{south east}{\northeast \pgf@y=-\pgf@y }% \anchor{low mid}{\northeast \pgf@x=0pt \pgf@y=-\pgf@y }% \anchor{low start}{\northeast \pgf@x=-\pgf@x \pgf@y=-\pgf@y }% \anchor{low end}{\northeast \pgf@y=-\pgf@y }% \anchor{mid}{\pgfpointorigin}% \anchor{mid east}{\northeast \pgf@y=0pt }% \anchor{mid west}{\northeast \pgf@y=0pt \pgf@x=-\pgf@x }% \anchor{mid end}{\northeast \pgf@y=0pt }% \anchor{mid start}{\northeast \pgf@y=0pt \pgf@x=-\pgf@x }% \anchor{base}{\northeast \pgf@x=0pt \pgf@y=-\pgf@y }% \anchor{base west}{\northeast \pgf@x=-\pgf@x \pgf@y=-\pgf@y }% \anchor{base east}{\northeast \pgf@y=-\pgf@y }% \anchorborder{% \@tempdima=\pgf@x \@tempdimb=\pgf@y \pgfpointborderrectangle{\pgfpoint{\@tempdima}{\@tempdimb}}{\northeast}% }% } % \end{macrocode} % % By default use the old node centers for backwards compatibility. % \begin{macrocode} \gdef\tikztiming@oldnodecenter@{}% \tikzset{timing/old@node@center/.code={\xdef\tikztiming@oldnodecenter@{% ++($ (0,0) - #1 $) [timing/no@old@node@center]}}% }% \tikzset{timing/no@old@node@center/.code={\gdef\tikztiming@oldnodecenter@{}}}% \def\tikztiming@oldnodecenter#1{% [timing/old@node@center={#1}] ++#1 } % \end{macrocode} % % \section{Other Macros} % % \begin{macro}{\tikztiming@iflower}[1]{Character} % \begin{macrocode} \def\tikztiming@iflower#1{% \begingroup \edef\@tempa{`#1}% \ifnum\@tempa=\lccode\@tempa \endgroup \expandafter \@firstoftwo \else \endgroup \expandafter \@secondoftwo \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@internaldefs}[3]{Character}{Character}{Character} % \begin{macrocode} \def\tikztiming@internaldefs{% \let\draw\relax \let\path\relax \let\p\relax \let\x\relax \let\y\relax \let\n\relax \let\tikztiming@oldnodecenter\relax \let\tikztiming@oldnodecenter@\relax \def\width{####1*\noexpand\timingwidth}% \def\fwidth{\noexpand\timingwidth}% \def\height{\noexpand\timingheight}% \def\slope{\noexpand\timingslope}% \def\zslope{\noexpand\timingzslope}% \def\dslope{\noexpand\timingdslope}% \def\gslope{0}% \def\style{timing/every char,timing/####3}% \def\bgstyle{draw=none,timing/every bg,timing/####3/background}% \def\nstyle{timing/every char,timing/####4}% \def\newdraw{\tikztiming@newdraw}% \def\newdrawns{\tikztiming@newdraw@nosave}% \def\code##1{ [/utils/exec={\unexpanded{##1}}] }% } % \end{macrocode} % \end{macro} % \begin{macro}{\tikztimingsetslope}[1]{Slope value} % \begin{macrocode} \def\tikztimingsetslope#1{% \pgfmathparse{min(1.0,{max(0.0,#1)})}% \let\tikztiming@slope\pgfmathresult \edef\timingslope{\tikztiming@slope*\noexpand\timingwidth}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztimingsetdslope}[1]{Slope value} % \begin{macrocode} \def\tikztimingsetdslope#1{% \pgfmathparse{min(1.0,{max(0.0,#1)})}% \let\tikztiming@dslope\pgfmathresult \edef\timingdslope{\tikztiming@dslope*\noexpand\timingwidth}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztimingsetzslope}[1]{Slope value} % \begin{macrocode} \def\tikztimingsetzslope#1{% \pgfmathparse{min(1.0,{max(0.0,#1)})}% \let\tikztiming@zslope\pgfmathresult \edef\timingzslope{\tikztiming@zslope*\noexpand\timingwidth}% } % \end{macrocode} % \end{macro} % % \begin{macrocode} \tikztimingsetslope{0.10}% \tikztimingsetdslope{0.20}% \tikztimingsetzslope{0.05}% % \end{macrocode} % % \section{Timing Character Definition Macros} % % \begin{macro}{\tikztiminguse}[1]{Character(s)} % \begin{macrocode} \def\tikztiminguse#1#2{% \@nameuse{\tikztiming@prefix#1}{#2}{##2}{##3}{##4}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztimingdef}[1]{One till three characters} % \begin{macrocode} \def\tikztimingdef#1{% \tikztimingdef@#1\empty\empty\relax } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztimingdef@}[3]{First character}{Second character or % empty}{Definition code} % \begin{macrocode} \def\tikztimingdef@#1#2#3\relax#4{% \ifx\empty#2\empty \tikztiming@nameedef{}{#1}{}{#4}% \else \tikztiming@nameedef{#1}{#2}{#3}{#4}% \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztimingcpy}[2]{New Character(s)}{Source Character(s)} % \begin{macrocode} \def\tikztimingcpy#1#2{% \begingroup \edef\tikztimingcpy@a{#1}% \edef\tikztimingcpy@b{#2}% \ifx\tikztimingcpy@a\tikztimingcpy@b \endgroup %\message{^^J Copy macro '#2' to '#1' skipped.^^J}% \else \endgroup \@ifundefined{\tikztiming@pfxtr#2\empty\empty\empty}% {\ifnum\tikztiming@debug>0\relax \message{^^J Copy macro '#2' to '#1' failed.^^J}\fi}% {\ifnum\tikztiming@debug>0\relax \message{^^J Copy macro '#2' to '#1'.^^J}\fi \expandafter\let \csname\tikztiming@pfxtr#1\empty\empty\empty\expandafter\endcsname \csname\tikztiming@pfxtr#2\empty\empty\empty\endcsname }% \fi } % \end{macrocode} % \end{macro} % % % \begin{macro}{\tikztiminglet}[2]{Original characters}{New characters} % \begin{macrocode} \def\tikztiminglet#1#2{% \tikztiming@namelet{#1}{#2}% } % \end{macrocode} % \end{macro} % % % \begin{macro}{\tikztiming@chars}[1]{Comma to gobble} % Initial definition of character list. Will gobble the separation comma in % front of the first character which is added to the list. % \begin{macrocode} \def\tikztiming@chars#1{} % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@ifcharexists}[1]{Character to check if in list} % \begin{macrocode} \def\tikztiming@ifcharexists#1{% \def\tikztiming@ifcharexists@##1,#1,##2\relax{% \ifx\relax##2\relax% \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi }% \expandafter\tikztiming@ifcharexists@ \expandafter,\tikztiming@chars,#1,\relax% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@addchar}[1]{Character} % \begin{macrocode} \def\tikztiming@addchar#1{% \tikztiming@ifcharexists{#1}{% \edef\tikztiming@chars{\tikztiming@chars,#1}% }{}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztimingchar}[1]{New character} % \begin{macrocode} \def\tikztimingchar#1{% \uppercase{% \tikztiming@addchar{#1}% \tikztimingchar@{#1}}% } % \end{macrocode} % \end{macro} % % \begin{macrocode} \@namedef{\tikztiming@prefix @@}#1#2#3#4{ coordinate (timing/start)}% % \end{macrocode} % % \begin{macro}{\tikztimingchar@}[3]{Character}{Start position}{Character % drawing code} % \begin{macrocode} \def\tikztimingchar@#1#2#3{% \tikztiming@nameedef{@}{#1}{}{#2 coordinate (timing/start) #3}% \tikztimingdef{{#1}{#1}}{#3}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztimingecopy}[2]{New character}{Original character} % \begin{macrocode} \def\tikztimingecopy#1#2{% \@namedef{tikztiming@alias@#1}{#2}% \tikztiming@addchar{#1}% \expandafter\let \csname tikztiming@triple@#1\expandafter\endcsname \csname tikztiming@triple@#2\endcsname \expandafter\let \csname tikztiming@nocombine@#1\expandafter\endcsname \csname tikztiming@nocombine@#2\endcsname } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@setref}[2]{Reference Name}{Shift Offset} % \begin{macrocode} \def\tikztiming@setref#1#2{% coordinate (#1) coordinate (#1) at ([shift={(#2)}]#1) } % \end{macrocode} % \end{macro} % % \section{NewDraw Macros} % % \begin{macro}{\tikztiming@newdraw} % \begin{macrocode} \def\tikztiming@newdraw{% node [timing/save] (timing@save) {};% \draw [timing/restore] (timing@save) ++(0,0) } % \end{macrocode} % \end{macro} % \begin{macro}{\tikztiming@newdraw@nosave} % \begin{macrocode} \def\tikztiming@newdraw@nosave{% node [timing/coord] (timing@save) {};% \draw [timing/nooptions] (timing@save) ++(0,0) } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@baseline} % \begin{macrocode} \def\tikztiming@baseline{% node [timing/save] (timing@save) {};% \draw [timing/restore] let \p1 = (timing@save) in (\x1,0) ++(0,0) } % \end{macrocode} % \end{macro} % % \section{Definition of Timing Characters} % % Pre-define list of timing characters to have it in a sorted fashion. % \begin{macrocode} \def\tikztiming@chars{H,L,Z,X,M,D,U,T,C}% % \end{macrocode} % % \subsection{Character `S'} % This character is now implemented as modifier to avoid hassle with triple % character transitions. % \begin{macrocode} \tikztiming@defcode{S}{% \pgfmathparse{\tikztimingwidth + \tikztiming@num}% \global\let\tikztimingwidth\pgfmathresult \tikztiming@output@Eaddcode{% coordinate (timing@ref) at ($ (timing@ref) + (\tikztiming@num,0) $) coordinate (timing@refa) at ($ (timing@refa) + (\tikztiming@num,0) $) coordinate (timing@refb) at ($ (timing@refb) + (\tikztiming@num,0) $) ++(\tikztiming@num,0) }% \tikztiming@parser } \tikztiming@defcode{s}{% \pgfmathparse{\tikztimingwidth + \tikztiming@num/2}% \global\let\tikztimingwidth\pgfmathresult \tikztiming@output@Eaddcode{% coordinate (timing@ref) at ($ (timing@ref) + (\tikztiming@num/2,0) $) coordinate (timing@refa) at ($ (timing@refa) + (\tikztiming@num/2,0) $) coordinate (timing@refb) at ($ (timing@refb) + (\tikztiming@num/2,0) $) ++(\tikztiming@num/2,0) }% \tikztiming@parser } % \end{macrocode} % % \subsection{Character `G'} % \begin{macrocode} \tikztiming@defcode{G}{% \tikztiming@output@addcode{% \tikztiming@glitch }% \tikztiming@parser } \tikztiming@defcode{g}{% \tikztiming@output@addcode{% \tikztiming@glitch }% \tikztiming@parser } \def\tikztiming@glitch{% {[timing/every char,timing/g] let \p1 = +(0,0) in (\x1,0) -- (\x1,\timingheight) coordinate (timing@dstart) at (\x1,\timingheight/2) (\x1,\y1) }% } % \end{macrocode} % % \subsection{Character `H'} % \begin{macrocode} \tikztimingchar{H}{++(0,\height)}{[\style] -- ++(#1,0)} \tikztimingdef{HH}{ -- ++(#1,0) } \tikztimingdef{LH}{ -- +(\slope, \height) -- ++(#1, \height) } \tikztimingdef{ZH}{ \newdraw [\style] -- ++(\zslope,+\height/2.) -- ++($ (#1,0) - (\zslope,0) $) } \tikztimingdef{DH}{ \tikztiming@oldnodecenter@% \newdraw [\style] -- +(\dslope/2.,\height/2.) -- ($ (timing@ref) + (#1,\height/2) $) } % \end{macrocode} % % \subsection{Character `L'} % \begin{macrocode} \tikztimingdef{DL}{ \tikztiming@oldnodecenter@ \newdraw [\style] -- +(\dslope/2.,-\height/2.) -- ($ (timing@ref) + (#1,-\height/2) $) } % \end{macrocode} % % \subsection{Character `'} % \begin{macrocode} \tikztimingchar{L}{++(0,0)}{[\style] -- ++(#1,0)} \tikztimingchar{Z}{++(0,\height/2.)}{% \newdraw [\style] -- ++(#1,0) } \tikztimingchar{D}{++(0,\height/2.)}{ node [timing/save] (timing@save) {}; \path [\bgstyle] (timing@save) ++(0,0) -- +(#1,0) -- +($ (#1,0) + 0.5*(\dslope,\height) $) -- +(#1,\height) -- +(0,\height) -- cycle; \draw [timing/restore,\style] (timing@save) ++(0,0) node [timing/save] (timing@dstart) at +(-\dslope/2.,\height/2.0) {} -- +(#1,0) ++(0,+\height) -- ++(#1,0) ++(0,-\height) } \def\tikztiming@triple@D{}% \def\tikztiming@triple@D@edge@{}% \def\tikztiming@nocombine@D@edge@{}% \def\tikztiming@alias@D@edge@{D}% % \end{macrocode} % % \begin{macro}{\tikztiming@trans@D@fill}[2]{Original width}{Width to subtract} % \begin{macrocode} \def\tikztiming@trans@D@fill#1#2{% node [timing/save] (timing@save) {}; \path [\bgstyle] (timing@save) ++(0,0) -- +(0.5*\dslope,-0.5*\height) -- ++($ (#1,-0.5*\height) - (#2,0) $) -- +(0.5*\dslope,0.5*\height) -- +(0,\height) -- ++($ (#2,\height) - (#1,0) + (0.5*\dslope,0) $) -- cycle; \draw [timing/restore,\style] (timing@save) ++(0,0) node [timing/save] (timing@dstart) {} } % \end{macrocode} % \end{macro} % % \begin{macrocode} \tikztimingdef{LL}{ -- ++(#1,0) } \tikztimingdef{HL}{ -- ++(\slope,-\height) \tikztiminguse{HH}{#1-\slope} } \tikztimingdef{LZ}{ \newdraw [\style] -- ++(\zslope,+\height/2.) -- ++($ (#1,0) - (\zslope,0) $) } \tikztimingdef{HZ}{% \newdraw [\style] -- ++(\zslope,-\height/2.) -- ++($ (#1,0) - (\zslope,0) $) } \tikztimingdef{ZL}{% \newdraw [\style] -- ++(\zslope,-\height/2.) -- ++($ (#1,0) - (\zslope,0) $) } \tikztimingdef{DZ}{ \tikztiming@oldnodecenter@ \newdraw [\style] -- ($ (timing@ref) + (#1,0) $) } \def\tikztiming@chard#1{% \newdraw [\style,preaction={\bgstyle}] coordinate (timing@dstart) -- +(\dslope/2,\height/2) -- ($ (timing@ref) + (#1,\height/2) $) -- +(\dslope/2,-\height/2) -- +(0,-\height) -- ($ (timing@dstart) + (\dslope/2,-\height/2) $) -- (timing@dstart) ($ (timing@ref) + (#1,0) $) coordinate (timing@ref) ++(\dslope/2,0) coordinate (timing@dend) \tikztiming@oldnodecenter{% (-\dslope/2,-\height/2) }% \newdraw [timing/every char] } \def\tikztiming@chard@#1{% \newdraw [\bgstyle] -- +(\dslope/2,\height/2) -- ($ (timing@ref) + (#1,\height/2) $) -- +(0,-\height)% -- ($ (timing@save) + (\dslope/2,-\height/2) $) -- (timing@save) \newdraw [\style] coordinate (timing@dstart) -- +(\dslope/2,\height/2) -- ($ (timing@ref) + (#1,\height/2) $) +(0,-\height)% -- ($ (timing@save) + (\dslope/2,-\height/2) $) -- (timing@save) ($ (timing@ref) + (#1,0) $) coordinate (timing@ref) \tikztiming@setref{timing@dend}{\dslope/2,0} \tikztiming@oldnodecenter{% (0,-\height/2) }% \newdraw [timing/every char] } \def\tikztiming@@chard#1{% ++(0,\height/2) \newdraw [\bgstyle] -- +(0,\height/2) -- ($ (timing@ref) + (#1,\height/2) $) -- +(\dslope/2,-\height/2) -- +(0,-\height) -- ($ (timing@save) + (0,-\height/2) $) -- (timing@save) \newdraw [\style] +(0,0) coordinate (timing/start) +(-\dslope/2,0) coordinate (timing@dstart) +(0,\height/2) -- ($ (timing@ref) + (#1,\height/2) $) -- +(\dslope/2,-\height/2) -- +(0,-\height) -- ($ (timing@save) + (0,-\height/2) $) ($ (timing@ref) + (#1,0) $) coordinate (timing@ref) ++(\dslope/2,0) coordinate (timing@dend) \tikztiming@oldnodecenter{% (-\dslope/2,-\height/2) }% \newdraw [timing/every char] } \def\tikztiming@@chard@#1{% ++(0,\height/2) \newdraw [\bgstyle] -- +(0,\height/2) -- ($ (timing@ref) + (#1,\height/2) $) -- +(0,-\height) -- ($ (timing@save) + (0,-\height/2) $) -- (timing@save) \newdraw [\style] +(0,0) coordinate (timing/start) coordinate (timing@ref) \tikztiming@setref{timing@dstart}{-\dslope/2,0} +(0,\height/2) -- +(#1,\height/2) +(#1,-\height/2) -- ($ (timing@save) + (0,-\height/2) $) ++(#1,\height/2) coordinate (timing@ref) \tikztiming@setref{timing@dend}{\dslope/2,0} \tikztiming@oldnodecenter{% (0,-\height/2) }% \newdraw [timing/every char] } \def\tikztiming@dchardu#1{% \tikztiming@oldnodecenter@ \newdraw [\bgstyle] -- +(0,\height/2) -- ($ (timing@ref) + (#1,\height/2) $) -- +(\dslope/2,-\height/2) -- +(0,-\height) -- ($ (timing@save) + (0,-\height/2) $) -- (timing@save) \newdraw [\style] +(0,\height/2) -- ($ (timing@ref) + (#1,\height/2) $) -- +(\dslope/2,-\height/2) -- +(0,-\height) -- ($ (timing@save) + (0,-\height/2) $) ($ (timing@ref) + (#1,0) $) coordinate (timing@ref) ++(\dslope/2,0) coordinate (timing@dend) \tikztiming@oldnodecenter{% (-\dslope/2,-\height/2) }% \newdraw [timing/every char] } \def\tikztiming@uchardd#1{% \tikztiming@oldnodecenter@ \newdraw [\bgstyle] -- +(\dslope/2,\height/2) -- ($ (timing@ref) + (#1,\height/2) $) -- +(0,-\height) -- ($ (timing@save) + (\dslope/2,-\height/2) $) -- (timing@save) \newdraw [\style] coordinate (timing@dstart) -- +(\dslope/2,\height/2) -- ($ (timing@ref) + (#1,\height/2) $) +(0,-\height) -- ($ (timing@save) + (\dslope/2,-\height/2) $) -- (timing@save) ($ (timing@ref) + (#1,0) $) coordinate (timing@ref) coordinate [shift={(\dslope/2,0)}](timing@dend) \tikztiming@oldnodecenter{% ($ (0,0) - (0,\height/2) $) }% \newdraw [timing/every char] } \tikztimingdef{DD}{% \tikztiming@dchardu{#1}% } \tikztimingdef{UU}{% \tikztiming@dchardu{#1}% } \def\tikztiming@dchard@#1{% \tikztiming@oldnodecenter@ \newdraw [\bgstyle] -- +(0,\height/2) -- ($ (timing@ref) + (#1,\height/2) $) -- +(0,-\height) -- ($ (timing@save) + (0,-\height/2) $) -- (timing@save) \newdraw [\style] +(0,\height/2) -- ($ (timing@ref) + (#1,\height/2) $) +(0,-\height) -- ($ (timing@save) + (0,-\height/2) $) ($ (timing@ref) + (#1,0) $) coordinate (timing@ref) \tikztiming@setref{timing@dend}{\dslope/2,0} \tikztiming@oldnodecenter{% (0,-\height/2) }% \newdraw [timing/every char] } \tikztimingdef{DD@}{ \tikztiming@dchard@{#1}% } \tikztimingcpy{DDD}{DD@} \tikztimingcpy{UUU}{DDD} \tikztimingdef{{D@edge@}{D@edge@}}{% \tikztiming@oldnodecenter@ \tikztiming@chard{#1}% }% \tikztimingdef{@{D@edge@}}{% \tikztiming@@chard@{#1}% }% \tikztimingdef{@{D@edge@}@}{% \tikztiming@@chard@{#1}% }% \tikztimingdef{@{D@edge@}D}{% \tikztiming@@chard{#1}% } \tikztimingdef{D{D@edge@}}{% \tikztiming@dchardu{#1}% } \tikztimingdef{U{U@edge@}}{% \tikztiming@dchardu{#1}% } \tikztimingdef{U{D@edge@}}{% \tikztiming@oldnodecenter@ \tikztiming@chard{#1}% } \tikztimingdef{U{D@edge@}@}{% \tikztiming@oldnodecenter@% \tikztiming@chard@{#1}% } \tikztimingdef{D{U@edge@}}{% \tikztiming@oldnodecenter@% \tikztiming@chard{#1}% } \tikztimingdef{D{U@edge@}@}{% \tikztiming@oldnodecenter@% \tikztiming@chard@{#1}% } \tikztimingdef{D{D@edge@}@}{% \tikztiming@dchard@{#1}% }% \tikztimingdef{U{U@edge@}@}{% \tikztiming@dchard@{#1}% }% \tikztimingdef{{D@edge@}{D@edge@}@}{% \tikztiming@oldnodecenter@% \tikztiming@chard@{#1}% }% \tikztimingdef{@{D@edge@}}{% \tikztiming@@chard{#1}% }% \tikztimingdef{{D@edge@}D}{% \tikztiming@oldnodecenter@% \tikztiming@chard{#1}% }% \tikztimingdef{{D@edge@}D@}{% \tikztiming@oldnodecenter@% \tikztiming@chard@{#1}% }% \tikztimingdef{ZDZ}{ coordinate (timing@ref) \tikztiming@chard{#1} } \tikztimingcpy{ZDX}{ZDZ} \tikztimingcpy{XDX}{ZDZ} \tikztimingcpy{XDZ}{ZDZ} \tikztimingdef{ZDD}{ coordinate (timing@ref) \tikztiming@chard@{#1} } \tikztimingdef{ZDU}{ coordinate (timing@ref) \tikztiming@chard{#1} } \tikztimingcpy{ZUD}{ZDU} \tikztimingcpy{ZUU}{ZDD} \tikztimingdef{ZD}{ coordinate (timing@ref) \tikztiming@chard{#1} } \tikztimingdef{@DD}{% \tikztiming@@chard@{#1}% } \tikztimingdef{ZD@}{% coordinate (timing@ref) \tikztiming@chard@{#1}% } \tikztimingdef{HD@}{% \tikztiming@setref{timing@ref}{0,-\height/2} -- ++(\dslope/2, -\height/2) \tikztiming@chard@{#1}% } \tikztimingdef{TD@}{% \tikztiming@setref{timing@ref}{0,-\height/2 * \value{tikztimingtrans}} -- ++(\dslope/2, -\height/2 * \value{tikztimingtrans}) \tikztiming@chard@{#1}% } \tikztimingdef{TD}{% \code{\setcounter{tikztimingtrans}{-\value{tikztimingtrans}}} \tikztiming@setref{timing@ref}{0,\height/2 * \value{tikztimingtrans}} -- ++(\dslope/2, \height/2 * \value{tikztimingtrans}) \tikztiming@chard{#1}% } \tikztimingdef{TDD}{% \code{\setcounter{tikztimingtrans}{-\value{tikztimingtrans}}} \tikztiming@setref{timing@ref}{0,\height/2 * \value{tikztimingtrans}} -- ++(\dslope/2, \height/2 * \value{tikztimingtrans}) \tikztiming@chard@{#1}% } \tikztimingdef{TUD}{% \code{\setcounter{tikztimingtrans}{-\value{tikztimingtrans}}} \tikztiming@setref{timing@ref}{0,\height/2 * \value{tikztimingtrans}} -- ++(\dslope/2, \height/2 * \value{tikztimingtrans}) \tikztiming@chard{#1}% } \tikztimingcpy{TDU}{TUD} \tikztimingcpy{TUU}{TDD} \tikztimingdef{LD@}{% \tikztiming@setref{timing@ref}{0,\height/2} -- ++(\dslope/2, \height/2) \tikztiming@chard@{#1}% } \tikztimingdef{@D}{% \tikztiming@@chard@{#1}% } \tikztimingdef{@D@}{% \tikztiming@@chard@{#1}% } \tikztimingcpy{H{D@edge@}@}{HD@} \tikztimingcpy{L{D@edge@}@}{LD@} \tikztimingcpy{Z{D@edge@}@}{ZD@} \tikztimingcpy{T{D@edge@}@}{TD@} \tikztimingdef{@DZ}{% \tikztiming@@chard{#1}% } \tikztimingdef{@DH}{% \tikztiming@@chard{#1}% } \tikztimingdef{@DL}{% \tikztiming@@chard{#1}% } \tikztimingdef{@DT}{% \tikztiming@@chard{#1}% } \tikztimingdef{LD}{ \tikztiming@setref{timing@ref}{0,\height/2} -- ++(\dslope/2, \height/2) \tikztiming@chard{#1}% } \tikztimingdef{LDD}{ \tikztiming@setref{timing@ref}{0,\height/2} -- ++(\dslope/2, \height/2) \tikztiming@chard@{#1} } \tikztimingdef{LDU}{ \tikztiming@setref{timing@ref}{0,\height/2} -- ++(\dslope/2, \height/2) \tikztiming@chard{#1} } \tikztimingcpy{LUD}{LDU} \tikztimingcpy{LUU}{LDD} \tikztimingdef{HD}{ \tikztiming@setref{timing@ref}{0,-\height/2} -- ++(\dslope/2, -\height/2) \tikztiming@chard{#1} } \tikztimingdef{HDD}{ \tikztiming@setref{timing@ref}{0,-\height/2} -- ++(\dslope/2, -\height/2) \tikztiming@chard@{#1} } \tikztimingdef{HDU}{ \tikztiming@setref{timing@ref}{0,-\height/2} -- ++(\dslope/2, -\height/2) \tikztiming@chard{#1} } \tikztimingcpy{HUD}{HDU} \tikztimingcpy{HUU}{HDD} % \end{macrocode} % % \subsection{Character `M'} % \begin{macrocode} \tikztimingecopy{M}{Z} \tikztimingchar{M}{++(0,\height/2.)}{ \newdraw [\style] -- ++(#1,0) \newdraw [\style/base] } \tikztimingdef{ZM}{ \newdraw [\style] -- ++(#1,0) \newdraw [\style/base] } \tikztimingdef{LM}{ \newdraw [\style/base] -- ++($ (1/8,0) + (0,\height/2) $) \newdraw [\style] -- ++($ (-1/8,0) + (#1,0) $) \newdraw [\style/base] } \tikztimingdef{HM}{ \newdraw [\style/base] -- ++($ (1/8,0) + (0,-1*\height/2) $) \newdraw [\style] -- ++($ (-1/8,0) + (#1,0) $) \newdraw [\style/base] } \tikztimingdef{DM}{ \tikztiming@oldnodecenter@% \newdraw [\style] -- ($ (timing@ref) + (#1,0) $) \newdraw [\style/base] } % \end{macrocode} % % \subsection{Character `T'} % \begin{macrocode} \newcounter{tikztimingtrans} \newcounter{tikztimingtranspos} \tikztimingchar{T}{++(0,0)}{ -- ++(#1,0) } \def\tikztiming@nocombine@T{}% \tikztimingdef{HT}{% {[\style] \code{\setcounter{tikztimingtrans}{-1}} -- ++(\slope,\value{tikztimingtrans}*\height) -- ++($ (#1,0) - (\slope,0) $) } } \tikztimingdef{LT}{% {[\style] \code{\setcounter{tikztimingtrans}{+1}} -- ++(\slope,\value{tikztimingtrans}*\height) -- ++($ (#1,0) - (\slope,0) $) } } \tikztimingdef{TL}{% \code{\setcounter{tikztimingtranspos}{\value{tikztimingtrans}}% \addtocounter{tikztimingtranspos}{+1}} -- ++(\slope, -0.5*\value{tikztimingtranspos}*\height) -- ++($ (#1,0) - (\slope,0) $) } \tikztimingdef{TH}{% \code{\setcounter{tikztimingtranspos}{\value{tikztimingtrans}}% \addtocounter{tikztimingtranspos}{-1}} -- ++(\slope, -0.5*\value{tikztimingtranspos}*\height) -- ++($ (#1,0) - (\slope,0) $) } \tikztimingdef{TZ}{% \newdraw [\style] \code{\setcounter{tikztimingtrans}{-\value{tikztimingtrans}}} -- ++(\zslope,\value{tikztimingtrans}*\height/2.) -- ++($ (#1,0) - (\zslope,0) $) } \tikztimingdef{ZT}{% \newdraw [timing/every char] {[\style] \code{\setcounter{tikztimingtrans}{-\value{tikztimingtrans}}} -- ++(\zslope,\value{tikztimingtrans}*\height/2.) -- ++($ (#1,0) - (\zslope,0) $) } } \tikztimingdef{TT}{% {[\style] \code{\setcounter{tikztimingtrans}{-\value{tikztimingtrans}}} -- ++(\slope,\value{tikztimingtrans}*\height) -- ++($ (#1,0) - (\slope,0) $) } } \tikztimingdef{DT}{ \code{\setcounter{tikztimingtrans}{-1}} \tikztiming@oldnodecenter@% \newdraw [timing/every char] {[\style] -- +(\dslope/2.,-\height/2) -- ($ (timing@ref) + (#1,-\height/2) $) } } \tikztimingdef{TM}{% \newdraw [\style/base] \code{\setcounter{tikztimingtrans}{-\value{tikztimingtrans}}} -- ++($ (1/8,0) + (0,\value{tikztimingtrans}*\height/2) $) \newdraw [\style] -- ++($ (-1/8,0) + (#1,0) $) \newdraw [\style/base] } % \end{macrocode} % % \subsection{Character `C'} % \begin{macrocode} \tikztimingecopy{C}{T} % \end{macrocode} % % \subsection{Character `U'} % \begin{macrocode} \tikztimingecopy{U}{D} \def\tikztiming@triple@U@edge@{}% \def\tikztiming@nocombine@U@edge@{}% \def\tikztiming@alias@U@edge@{D@edge@}% \tikztimingcpy{UU@}{DD@}% \tikztimingdef{UDU}{% \tikztiming@oldnodecenter@% \tikztiming@chard{#1}% } \tikztimingcpy{DUD}{UDU}% \tikztimingdef{UDD}{% \tikztiming@uchardd{#1}% } \tikztimingcpy{{D@edge@}DD}{UDD} \tikztimingcpy{{U@edge@}UU}{{D@edge@}DD} \tikztimingdef{H{D@edge@}}{ \tikztiming@setref{timing@ref}{0,-\height/2} -- ++(\dslope/2, -\height/2) \tikztiming@chard{#1}% } \tikztimingdef{L{D@edge@}}{ \tikztiming@setref{timing@ref}{0,\height/2} -- ++(\dslope/2, \height/2) \tikztiming@chard{#1}% } \tikztimingdef{Z{D@edge@}}{ coordinate (timing@ref) \tikztiming@chard{#1}% } \tikztimingdef{T{D@edge@}}{ \code{\setcounter{tikztimingtrans}{-\value{tikztimingtrans}}} \tikztiming@setref{timing@ref}{0,\height/2 * \value{tikztimingtrans}} -- ++(\dslope/2, \height/2 * \value{tikztimingtrans}) \tikztiming@chard{#1}% } \tikztimingdef{{D@edge@}DU}{ \tikztiming@oldnodecenter@ \tikztiming@chard{#1} } \tikztimingcpy{{U@edge@}UD}{{D@edge@}DU} \tikztimingdef{DDU}{% \tikztiming@dchardu{#1} } \tikztimingcpy{DUU}{UDD}% \tikztimingcpy{UUD}{DDU}% \tikztimingdef{@UU}{% \tikztiming@@chard@{#1}% } \tikztimingdef{@UD}{% \tikztiming@@chard{#1}% } \tikztimingdef{@DU}{% \tikztiming@@chard{#1}% } \tikztimingdef{UD}{% \tikztiming@oldnodecenter@% \tikztiming@chard{#1}% } \tikztimingdef{DU}{% \tikztiming@oldnodecenter@% \tikztiming@chard{#1}% } \tikztimingdef{UD@}{% \tikztiming@oldnodecenter@% \tikztiming@chard@{#1}% } \tikztimingdef{DU@}{% \tikztiming@oldnodecenter@% \tikztiming@chard@{#1}% } % \end{macrocode} % % \subsection{Character `X'} % \begin{macrocode} \tikztimingecopy{X}{Z} % \end{macrocode} % % Save current list of characters as list of default characters. % \begin{macrocode} \let\tikztiming@chars@default\tikztiming@chars % \end{macrocode} % % \clearpage % \section{Libraries} % % \begin{macrocode} \newcommand*\usetikztiminglibrary[2][]{% \edef\tikztiming@library@options{#1}% \@ifnextchar{[}%] {\tikztiming@library{#2}}% {\tikztiming@library{#2}[]}% } \def\tikztiming@library#1[#2]{% \edef\tikztiming@library@date{#2}% \tikztiming@library@#1,\relax } % \end{macrocode} % Load the library as package. The \LaTeX\ core macro \cs{zap@space} is patched % to a no-op to keep spaces in the option text. Otherwise the option keys may % not contain spaces. % \begin{macrocode} \def\tikztiming@zap@space#1 \@empty{#1} \def\tikztiming@library@#1,{% \IfFileExists{tikz-timing-#1.sty}% { \let\tikztiming@orig@zap@space\zap@space \let\zap@space\tikztiming@zap@space \RequirePackage [\tikztiming@library@options]% {tikz-timing-#1}% [\tikztiming@library@date]% \let\zap@space\tikztiming@orig@zap@space }% {\PackageError{tikz-timing}% {No tikz-timing library `#1' found!}{}% }% \@ifnextchar\relax{}{\tikztiming@library@}% } % \end{macrocode} % \iffalse % % \fi % % \subsection{Libraries} % % \subsubsection{Either High or Low} % \iffalse %<*tikz-timing-either.sty> % \fi % \begin{macrocode} % \NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesPackage{tikz-timing-either}[% % % %<*DRIVER> 2099/01/01 develop % tikz-timing library for uncertain transitions] % \end{macrocode} % % Provides character "E". % \begin{macrocode} \tikztimingchar{E}{ ++(0,0) \code{\setcounter{tikztimingtranspos}{0}}% \code{\setcounter{tikztimingtrans}{1}}% }{ \code{\setcounter{tikztimingtranspos}{0}}% \code{\setcounter{tikztimingtrans}{1}}% \tikztiminguse{D}{#1}% \newdraw [\style] } \def\tikztiming@triple@E{}% \tikztimingdef{LE@}{% \newdraw [\bgstyle] -- ++(\slope,\height)% -- ++($ (#1,0) - (\slope,0) $)% -- ++(0,-\height)% -- ++($ -1*(#1,0) $)% \newdraw [\style] -- ++(\slope,\height)% -- ++($ (#1,0) - (\slope,0) $)% ++($ -1*(#1,\height) $)% -- ++($ 1*(#1,0) $)% ++(0,.5\height)% \newdraw [\nstyle] \code{\setcounter{tikztimingtranspos}{0}}% \code{\setcounter{tikztimingtrans}{1}}% }% \tikztimingdef{HE@}{% \newdraw [\bgstyle] -- ++(\slope,-\height)% -- ++($ (#1,0) - (\slope,0) $)% -- ++(0,\height)% -- ++($ -1*(#1,0) $)% \newdraw [\style] -- ++(\slope,-\height)% -- ++($ (#1,0) - (\slope,0) $)% ++($ -1*(#1,-\height) $)% -- ++($ 1*(#1,0) $)% ++(0,-.5\height)% \newdraw [\nstyle] \code{\setcounter{tikztimingtranspos}{1}}% \code{\setcounter{tikztimingtrans}{-1}}% }% \tikztimingdef{TE@}{% \newdraw [\bgstyle] -- ++(\slope,-\height * \value{tikztimingtrans})% -- ++($ (#1,0) - (\slope,0) $)% -- ++(0,\height * \value{tikztimingtrans})% -- ++($ -1*(#1,0) $)% \newdraw [\style] -- ++(\slope,-\height * \value{tikztimingtrans})% -- ++($ (#1,0) - (\slope,0) $)% ++($ -1*(#1,-\height * \value{tikztimingtrans}) $)% -- ++($ 1*(#1,0) $)% ++(0,-1*\value{tikztimingtrans}*.5*\height)% \newdraw [\nstyle] }% \tikztimingdef{LEL}{% \newdraw [\style,preaction={\bgstyle}] -- +(\slope,\height)% -- +(#1,\height)% -- +($ (#1,0) + (\slope,0) $)% -- +(0,0) ++(#1,\height/2) coordinate (timing@ref) ++(\slope,-\height/2)% \newdraw [\nstyle] }% \tikztimingdef{LEH}{% \newdraw [\style,preaction={\bgstyle}] -- +(\slope,\height)% -- +($ (#1,\height) + (\slope,0) $)% -- +(#1,0)% -- +(0,0) ++(#1,\height/2) coordinate (timing@ref) ++(\slope,\height/2)% \newdraw [\nstyle] }% \tikztimingdef{HEH}{% \newdraw [\style,preaction={\bgstyle}] -- +($ (#1,0) + (\slope,0) $)% -- +(#1,-\height)% -- +(\slope,-\height) -- +(0,0) ++(#1,-\height/2) coordinate (timing@ref) ++(\slope,\height/2)% \newdraw [\nstyle] }% \tikztimingdef{HEL}{% \newdraw [\style,preaction={\bgstyle}] -- +(#1,0) -- +($ (#1,-\height) + (\slope,0) $)% -- +(\slope,-\height) -- +(0,0) ++(#1,-\height/2) coordinate (timing@ref) ++(\slope,-\height/2)% \newdraw [\nstyle] }% \tikztimingdef{HET}{ \newdraw [\style,preaction={\bgstyle}] -- +(#1,0) {[\nstyle] -- +($ (#1,-\height) + (\slope,0) $)% } -- +(\slope,-\height) -- +(0,0) {[\nstyle] ++(#1,-\height/2) coordinate (timing@ref) ++(\slope,-\height/2)% } \newdraw [\nstyle] \code{\setcounter{tikztimingtrans}{-1}}% } \tikztimingdef{LET}{ \newdraw [\style,preaction={\bgstyle}] -- +(\slope,\height)% {[\nstyle] -- +($ (#1,\height) + (\slope,0) $)% } -- +(#1,0)% -- +(0,0) {[\nstyle] ++(#1,\height/2)% coordinate (timing@ref) ++(\slope,\height/2)% } \newdraw [\nstyle] \code{\setcounter{tikztimingtrans}{1}}% } \tikztimingdef{HEE}{% \newdraw [\style,preaction={\bgstyle}] -- +(#1,0) coordinate (timing@refb) \tikztiming@setref{timing@ref}{0,-\height/2} -- +($ (#1,-\height) + (\slope,0) $) coordinate (timing@refa) -- +(\slope,-\height) -- +(0,0) \tikztiming@setref{timing@ref}{#1,-\height/2} ++($ (#1,-\height) + (\slope,0) $)% \code{\setcounter{tikztimingtranspos}{1}}% \code{\setcounter{tikztimingtrans}{-1}}% \newdraw [\nstyle] }% \tikztimingdef{LEE}{% \newdraw [\style,preaction={\bgstyle}] -- +(#1,0) coordinate (timing@refa) \tikztiming@setref{timing@ref}{0,\height/2} -- +($ (#1,\height) + (\slope,0) $) coordinate (timing@refb) -- +(\slope,\height) -- +(0,0) ++(#1,0) \tikztiming@setref{timing@ref}{0,\height/2} \code{\setcounter{tikztimingtranspos}{0}}% \code{\setcounter{tikztimingtrans}{1}}% \newdraw [\nstyle] }% \tikztimingdef{TEE}{% \newdraw [\style,preaction={\bgstyle}] -- +(\slope, -\height * \value{tikztimingtrans})% -- +($ (#1,0) + (\slope, -\height * \value{tikztimingtrans}) $) -- +(#1,0) -- +(0,0)% \code{\setcounter{tikztimingtranspos}{\value{tikztimingtrans}}% \addtocounter{tikztimingtranspos}{+1}} +($ (#1,0) + (\slope/2 + \slope/2 * \value{tikztimingtrans}, -\height/2 * \value{tikztimingtranspos}) $) coordinate (timing@refa) +($ (#1,0) + (\slope/2 - \slope/2 * \value{tikztimingtrans}, \height - \height/2 * \value{tikztimingtranspos}) $) coordinate (timing@refb) ++(#1,0) \tikztiming@setref{timing@ref}{0,-\height/2 * \value{tikztimingtrans}} ++( .5 * \slope + .5 * \value{tikztimingtrans} * \slope, -.5 * \height - .5 * \value{tikztimingtrans} * \height ) \code{\setcounter{tikztimingtrans}{-\value{tikztimingtrans}}} \newdraw [\nstyle] }% \tikztimingdef{TEH}{% \newdraw [\style,preaction={\bgstyle}] -- ++(\slope,-\height * \value{tikztimingtrans}) -- ++($ (#1,0) - (\slope/2 + \slope/2 * \value{tikztimingtrans},0) $) -- ++(\slope * \value{tikztimingtrans}, \height * \value{tikztimingtrans}) -- ++($ -1*(#1,0) - (\slope/2 + \slope/2 * \value{tikztimingtrans},0) $) ++($ (#1,-\height/2 * \value{tikztimingtrans}) $) coordinate (timing@ref) ++(\slope,\height/2) \newdraw [\nstyle] } \tikztimingdef{TEL}{% \newdraw [\style,preaction={\bgstyle}] -- ++(\slope,-\height * \value{tikztimingtrans}) -- ++($ (#1,0) - (\slope/2 - \slope/2 * \value{tikztimingtrans},0) $) -- ++(-\slope * \value{tikztimingtrans}, \height * \value{tikztimingtrans}) -- ++($ -1*(#1,0) - (\slope/2 + -\slope/2 * \value{tikztimingtrans},0) $) ++($ (#1,-\height/2 * \value{tikztimingtrans}) $) coordinate (timing@ref) ++(\slope,-\height/2) \newdraw [\nstyle] } \tikztimingdef{TEZ}{% \newdraw [\style,preaction={\bgstyle}] -- ++(\slope,-\height * \value{tikztimingtrans}) -- ++($ (#1,0) - (\slope,0) $) -- ++(\zslope, \height/2 * \value{tikztimingtrans}) -- ++(-\zslope, \height/2 * \value{tikztimingtrans}) -- ++($ -1*(#1,0) $) ++($ (#1,0) + (0,-\height/2 * \value{tikztimingtrans}) $) coordinate (timing@ref) ++(\zslope,0) \newdraw [\nstyle] } \tikztimingdef{TED}{% \newdraw [\style,preaction={\bgstyle}] -- ++(\slope,-\height * \value{tikztimingtrans}) -- ++($ (#1,0) - (\slope,0) $) -- ++(\dslope/2, \height/2 * \value{tikztimingtrans}) -- ++(-\dslope/2, \height/2 * \value{tikztimingtrans}) -- ++($ -1*(#1,0) $) ++($ (#1,0) + (0,-\height/2 * \value{tikztimingtrans}) $) coordinate (timing@ref) ++(\dslope/2,0) \newdraw [\nstyle] } \tikztimingdef{TET}{% \newdraw [\style,preaction={\bgstyle}] -- +(\slope, -\height * \value{tikztimingtrans})% {[\nstyle] -- +($ (#1,0) + (\slope, -\height * \value{tikztimingtrans}) $)% } -- +(#1,0)% -- +(0,0)% {[\nstyle] ++($ (#1,0) + (0, -\height/2 * \value{tikztimingtrans}) $)% coordinate (timing@ref) ++(\slope, -\height/2 * \value{tikztimingtrans})% } \code{\setcounter{tikztimingtrans}{-\value{tikztimingtrans}}} \newdraw [\nstyle] }% \tikztimingdef{EEZ}{% \newdraw [\style,preaction={\bgstyle}] -- (timing@refb) -- ($ (timing@ref) + (#1,+\height/2) $) -- ($ (timing@ref) + (#1,0) + (\zslope,0) $) -- ($ (timing@ref) + (#1,-\height/2) $) -- (timing@refa) ($ (timing@ref) + (#1,0) + (\zslope,0) $) coordinate (timing@ref) at ($ (timing@ref) + (#1,0) $) \newdraw }% \tikztimingdef{EED}{% \newdraw [\style,preaction={\bgstyle}] -- (timing@refb) -- ($ (timing@ref) + (#1,+\height/2) $) -- ($ (timing@ref) + (#1,0) + (\dslope/2,0) $) -- ($ (timing@ref) + (#1,-\height/2) $) -- (timing@refa) ($ (timing@ref) + (#1,0) + (\dslope/2,0) $) coordinate (timing@ref) at ($ (timing@ref) + (#1,0) $) \newdraw }% \tikztimingdef{HEZ}{% \newdraw [\style,preaction={\bgstyle}] -- +(#1,0) -- +($ (#1,-\height/2) + (\zslope,0) $)% -- +(#1,-\height) -- +(\slope,-\height) -- +(0,0) ++(#1,-\height/2) coordinate (timing@ref) ++(\zslope,0)% \newdraw }% \tikztimingdef{LEZ}{% \newdraw [\style,preaction={\bgstyle}] -- +(\slope,\height) -- +(#1,\height) -- +($ (#1,\height/2) + (\zslope,0) $)% -- +(#1,0) -- +(0,0) ++(#1,\height/2) coordinate (timing@ref) ++(\zslope,0)% \newdraw }% \tikztimingdef{LED}{% \newdraw [\style,preaction={\bgstyle}] -- +(\slope,\height) -- +(#1,\height) -- +($ (#1,\height/2) + (\dslope/2,0) $)% -- +(#1,0) -- +(0,0) ++(#1,\height/2) coordinate (timing@ref) ++(\dslope/2,0)% \newdraw }% \tikztimingdef{HED}{% \newdraw [\style,preaction={\bgstyle}] -- +(#1,0) -- +($ (#1,-\height/2) + (\dslope/2,0) $)% -- +(#1,-\height) -- +(\slope,-\height) -- +(0,0) ++(#1,-\height/2) coordinate (timing@ref) ++(\dslope/2,0)% \newdraw }% \tikztimingdef{EZ}{% \newdraw [\style] -- ($ (timing@ref) + (#1,0) $)% } \tikztimingdef{EM}{% \newdraw [\style] -- ($ (timing@ref) + (#1,0) $)% \newdraw [\style/base] } \tikztimingdef{EL}{% -- ($ (timing@ref) + (#1,-\height/2) $)% }% \tikztimingdef{EH}{% -- ($ (timing@ref) + (#1,+\height/2) $)% }% \tikztimingdef{ED@}{% \tikztiming@chard@{#1}% } \tikztimingcpy{E{D@edge@}@}{ED@} \tikztimingdef{ED}{% \tikztiming@chard{#1}% } \tikztimingcpy{E{D@edge@}}{ED} \tikztimingdef{EDD}{% \tikztiming@chard@{#1}% } \tikztimingdef{EUU}{% \tikztiming@chard@{#1}% } \tikztimingdef{EDU}{% \tikztiming@chard{#1}% } \tikztimingdef{EUD}{% \tikztiming@chard{#1}% } \tikztimingdef{DE@}{% \tikztiming@oldnodecenter@% \newdraw [\bgstyle] -- +(\dslope/2,\height/2) -- ($ (timing@ref) + (#1,\height/2) $)% -- ($ (timing@ref) + (#1,-\height/2) $)% -- ($ (timing@save) + (\dslope/2,-\height/2) $) -- (timing@save) \newdraw [\style] -- +(\dslope/2,\height/2) -- ($ (timing@ref) + (#1,\height/2) $)% ($ (timing@ref) + (#1,-\height/2) $)% -- ($ (timing@save) + (\dslope/2,-\height/2) $) -- (timing@save) ($ (timing@ref) + (#1,0) $)% coordinate (timing@ref) } \tikztimingdef{EEE}{% \newdraw [\style,preaction={\bgstyle}] -- (timing@refb) -- ($ (timing@refb) + (#1,0) $) -- ($ (timing@refa) + (#1,0) $) -- (timing@refa) ++(#1,0) coordinate (timing@refa) coordinate (timing@refb) at ($ (timing@refb) + (#1,0) $) coordinate (timing@ref) at ($ (timing@ref) + (#1,0) $) \newdraw [\nstyle] }% \tikztimingdef{EET}{% \newdraw [\style,preaction={\bgstyle}] -- (timing@refb) {[\nstyle] -- ($ (timing@ref) + (#1,+\height/2) + (\slope/2 + \slope/2 * \value{tikztimingtrans},0) $) -- ($ (timing@ref) + (#1,-\height/2) + (\slope/2 - \slope/2 * \value{tikztimingtrans},0) $) } -- (timing@refa) {[\nstyle] ($ (timing@ref) + (#1,\height/2 * \value{tikztimingtrans}) + (\slope,0) $) } coordinate (timing@ref) at ($ (timing@ref) + (#1,0) $) \newdraw [\nstyle] }% \tikztimingdef{EEL}{% \newdraw [\style,preaction={\bgstyle}] -- (timing@refb) -- ($ (timing@ref) + (#1,+\height/2) $) -- ($ (timing@ref) + (#1,-\height/2) + (\slope,0) $) -- (timing@refa) ($ (timing@ref) + (#1,-\height/2) + (\slope,0) $) coordinate (timing@ref) at ($ (timing@ref) + (#1,0) $) \newdraw [\nstyle] }% \tikztimingdef{EEH}{% \newdraw [\style,preaction={\bgstyle}] -- (timing@refb) -- ($ (timing@ref) + (#1,+\height/2) + (\slope,0) $) -- ($ (timing@ref) + (#1,-\height/2) $) -- (timing@refa) ($ (timing@ref) + (#1,+\height/2) + (\slope,0) $) coordinate (timing@ref) at ($ (timing@ref) + (#1,0) $) \newdraw [\nstyle] }% \tikztimingdef{EE@}{% \newdraw [\bgstyle] let \p0 = (timing@ref), \p1 = (timing@refa), \p2 = (timing@refb) in -- (\p2) -- ($ (\x0,\y2) + (#1,0) $) -- +(0,\y1-\y2) -- (\p1) \newdraw [\style] let \p0 = (timing@ref), \p1 = (timing@refa), \p2 = (timing@refb) in -- (\p2) -- ($ (\x0,\y2) + (#1,0) $) +(0,\y1-\y2) -- (\p1) ($ (timing@ref) + (#1,0) $) coordinate (timing@ref) \newdraw [\nstyle] }% \tikztimingdef{ZE@}{ \newdraw [\bgstyle] -- +(\zslope,\height/2) -- +(#1,\height/2)% -- +(#1,-\height/2)% -- +(\zslope,-\height/2) -- +(0,0) \newdraw [\style] -- +(\zslope,\height/2) -- +(#1,\height/2)% +(#1,-\height/2)% -- +(\zslope,-\height/2) -- +(0,0) ++(#1,0) coordinate (timing@ref) } \tikztimingdef{ZEH}{% \newdraw [\style,preaction={\bgstyle}] -- +(\zslope, \height/2) -- +($ (#1,0) + (\slope, \height/2) $) -- +(#1,-\height/2) -- +(\zslope, -\height/2) -- +(0,0) ++(#1,0) coordinate (timing@ref) ++(\slope, \height/2) \newdraw [\nstyle] } \tikztimingdef{ZEL}{% \newdraw [\style,preaction={\bgstyle}] -- +(\zslope, \height/2) -- +(#1,\height/2) -- +($ (#1,0) + (\slope, -\height/2) $) -- +(\zslope, -\height/2) -- +(0,0) ++(#1,0) coordinate (timing@ref) ++(\slope, -\height/2) \newdraw [\nstyle] } \tikztimingdef{ZET}{% \newdraw [\style,preaction={\bgstyle}] -- +(\zslope, \height/2) {[\nstyle] -- +($ (#1, \height/2) + (\slope/2 - \slope/2 * \value{tikztimingtrans}, 0) $) -- +($ (#1,-\height/2) + (\slope/2 + \slope/2 * \value{tikztimingtrans}, 0) $) } -- +(\zslope, -\height/2) -- +(0,0) {[\nstyle] ++(#1,0) coordinate (timing@ref) ++(\slope,-\height/2 * \value{tikztimingtrans}) } \code{\setcounter{tikztimingtrans}{-\value{tikztimingtrans}}} \newdraw [\nstyle] } \tikztimingdef{DET}{% \tikztiming@oldnodecenter@% \newdraw [\style,preaction={\bgstyle}] -- +(\dslope/2, \height/2) {[\nstyle] -- ($ (timing@ref) + (#1, \height/2) + (\slope/2 - \slope/2 * \value{tikztimingtrans}, 0) $) -- ($ (timing@ref) + (#1,-\height/2) + (\slope/2 + \slope/2 * \value{tikztimingtrans}, 0) $) } -- ($ (timing@save) + (\dslope/2, -\height/2) $) -- (timing@save) {[\nstyle] ($ (timing@ref) + (#1,0) $) coordinate (timing@ref) ++(\slope,-\height/2 * \value{tikztimingtrans}) } \code{\setcounter{tikztimingtrans}{-\value{tikztimingtrans}}} \newdraw [\nstyle] } \tikztimingdef{ZEZ}{% \newdraw [\style,preaction={\bgstyle}] -- +(\zslope, \height/2) -- +(#1,\height/2) -- +($ (#1,0) + (\zslope, 0) $) -- +(#1,-\height/2) -- +(\zslope, -\height/2) -- +(0,0) ++(#1,0) coordinate (timing@ref) ++(\zslope, 0) \newdraw [\nstyle] } \tikztimingdef{ZEE}{% \newdraw [\style,preaction={\bgstyle}] -- +(\zslope, \height/2) -- +($ (#1,0) + (\slope, \height/2) $) coordinate (timing@refb) -- +(#1,-\height/2) coordinate (timing@refa) -- +(\zslope, -\height/2) -- +(0,0) +(#1,0) coordinate (timing@ref) ++(#1,-\height/2) \code{\setcounter{tikztimingtranspos}{0}}% \code{\setcounter{tikztimingtrans}{1}}% } \tikztimingdef{DEE}{% \tikztiming@oldnodecenter@ \newdraw [\style,preaction={\bgstyle}] -- +(\dslope/2, \height/2) -- ($ (timing@ref) + (#1,0) + (\slope, \height/2) $) coordinate (timing@refb) -- ($ (timing@ref) + (#1,-\height/2) $) coordinate (timing@refa) -- ($ (timing@save) + (\dslope/2, -\height/2) $) -- (timing@save) coordinate (timing@ref) at ($ (timing@ref) + (#1,0) $) (timing@refa) \code{\setcounter{tikztimingtranspos}{0}}% \code{\setcounter{tikztimingtrans}{1}}% } \tikztimingdef{DED}{% \tikztiming@oldnodecenter@% \newdraw [\style,preaction={\bgstyle}] -- +(\dslope/2, \height/2) -- ($ (timing@ref) + (#1,\height/2) $) -- ($ (timing@ref) + (#1,0) + (\dslope/2,0) $) -- ($ (timing@ref) + (#1,-\height/2) $) -- ($ (timing@save) + (\dslope/2, -\height/2) $) -- (timing@save) ($ (timing@ref) + (#1,0) $) coordinate (timing@ref) ++(\dslope/2,0) \newdraw [\nstyle] } \tikztimingdef{ZED}{% \newdraw [\style,preaction={\bgstyle}] -- +(\zslope, \height/2) -- +(#1,\height/2) -- +($ (#1,0) + (\dslope/2, 0) $) -- +(#1,-\height/2) -- +(\zslope, -\height/2) -- +(0,0) ++(#1,0) coordinate (timing@ref) ++(\dslope/2, 0) \newdraw [\nstyle] } \tikztimingdef{DEZ}{% \tikztiming@oldnodecenter@ \newdraw [\style,preaction={\bgstyle}] -- +(\dslope/2, \height/2) -- ($ (timing@ref) + (#1,\height/2) $) -- ($ (timing@ref) + (#1,0) + (\zslope, 0) $) -- ($ (timing@ref) + (#1,-\height/2) $) -- ($ (timing@save) + (\dslope/2, -\height/2) $) -- (timing@save) ($ (timing@ref) + (#1,0) $) coordinate (timing@ref) ++(\zslope, 0) \newdraw [\nstyle] } \tikztimingdef{DEH}{% \tikztiming@oldnodecenter@% \newdraw [\style,preaction={\bgstyle}] -- +(\dslope/2, \height/2) -- ($ (timing@ref) + (#1,0) + (\slope, \height/2) $) -- ($ (timing@ref) + (#1,-\height/2) $) -- ($ (timing@save) + (\dslope/2, -\height/2) $) -- (timing@save) ($ (timing@ref) + (#1,0) $) coordinate (timing@ref) ++(\slope, \height/2) \newdraw [\nstyle] } \tikztimingdef{DEL}{% \tikztiming@oldnodecenter@% \newdraw [\style,preaction={\bgstyle}] -- +(\dslope/2, \height/2) -- ($ (timing@ref) + (#1,\height/2) $) -- ($ (timing@ref) + (#1,0) + (\slope, -\height/2) $) -- ($ (timing@save) + (\dslope/2, -\height/2) $) -- (timing@save) ($ (timing@ref) + (#1,0) $) coordinate (timing@ref) ++(\slope, -\height/2) \newdraw [\nstyle] } \tikztimingdef{@E}{% \code{\setcounter{tikztimingtranspos}{0}}% \code{\setcounter{tikztimingtrans}{1}}% \tikztiminguse{@D}{#1} } \tikztimingdef{@DE}{% \tikztiming@@chard{#1}% } \tikztimingdef{DDE}{ ++(0,-\height/2) \tikztiming@oldnodecenter{% (0,+\height/2) }% \tikztiming@@chard{#1}% } \tikztimingdef{@EH}{% \tikztiming@setref{timing/start}{0,\height/2} \newdraw [\bgstyle] -- +(0,\height) -- +($ (#1,\height) + (\slope,0) $) -- +(#1,0) -- +(0,0) \newdraw [\style] +(0,\height) -- +($ (#1,\height) + (\slope,0) $) -- +(#1,0) -- +(0,0) ++(#1,\height/2) coordinate (timing@ref) ++(\slope,\height/2) \newdraw [\nstyle] } \tikztimingdef{@ET}{% \tikztiming@setref{timing/start}{0,\height/2} \newdraw [\bgstyle] -- +(0,\height) {[\nstyle] -- ($ (timing@ref) + (#1,\height/2) + (\slope,0) $) } -- ($ (timing@ref) + (#1,-\height/2) $) -- (timing@save) \newdraw [\style] +(0,\height) {[\nstyle] -- ($ (timing@ref) + (#1,\height/2) + (\slope,0) $) } -- ($ (timing@ref) + (#1,-\height/2) $) -- (timing@save) {[\nstyle] ($ (timing@ref) + (#1,0) $) coordinate (timing@ref) ++(\slope,\height/2) } \newdraw [\nstyle] \code{\setcounter{tikztimingtrans}{-\value{tikztimingtrans}}} } \tikztimingdef{ET}{% {[\style] -- ($ (timing@ref) + (#1,\height/2 * \value{tikztimingtrans}) $) } } \tikztimingdef{@EL}{% \tikztiming@setref{timing/start}{0,\height/2} \newdraw [\bgstyle] -- +(0,\height) -- +(#1,\height) -- +($ (#1,0) + (\slope,0) $) -- +(0,0) \newdraw [\style] +(0,\height) -- +(#1,\height) -- +($ (#1,0) + (\slope,0) $) -- +(0,0) ++(#1,\height/2) coordinate (timing@ref) ++(\slope,-\height/2) \newdraw [\nstyle] } \tikztimingdef{@ED}{% \tikztiming@setref{timing/start}{0,\height/2} \newdraw [\bgstyle] -- +(0,\height) -- +(#1,\height) -- +($ (#1,\height/2) + (\dslope/2,0) $) -- +(#1,0) -- +(0,0) \newdraw [\style] +(0,\height) -- +(#1,\height) -- +($ (#1,\height/2) + (\dslope/2,0) $) -- +(#1,0) -- +(0,0) ++(#1,\height/2) coordinate (timing@ref) ++(\dslope/2,0) } \tikztimingdef{@EZ}{% \tikztiming@setref{timing/start}{0,\height/2} \newdraw [\bgstyle] -- +(0,\height) -- +(#1,\height) -- +($ (#1,\height/2) + (\zslope,0) $) -- +(#1,0) -- +(0,0) \newdraw [\style] +(0,\height) -- +(#1,\height) -- +($ (#1,\height/2) + (\zslope,0) $) -- +(#1,0) -- +(0,0) ++(#1,\height/2) coordinate (timing@ref) ++(\zslope,0) } \tikztimingdef{@EE}{% \tikztiming@setref{timing/start}{0,\height/2} \newdraw [\bgstyle] -- +(0,\height) -- +($ (#1,\height) + (\slope,0) $) -- +(#1,0) -- +(0,0) \newdraw [\style] +(0,\height) -- +($ (#1,\height) + (\slope,0) $) coordinate (timing@refb) -- +(#1,0) coordinate (timing@refa) -- +(0,0) ++(#1,0) \tikztiming@setref{timing@ref}{0,\height/2} \code{\setcounter{tikztimingtranspos}{0}}% \code{\setcounter{tikztimingtrans}{1}}% } \def\tikztiming@nocombine@E{}%% % \end{macrocode} % % \iffalse % % \fi % % \subsubsection{Clock Arrows} % \iffalse %<*tikz-timing-clockarrows.sty> % \fi % \begin{macrocode} % \NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesPackage{tikz-timing-clockarrows}[% % % %<*DRIVER> 2099/01/01 develop % tikz-timing library for timing clock arrows] % \end{macrocode} % % \begin{macrocode} \tikztiming@iftrans{CC}% {\let\tikztiming@trans@C@normal@C\tikztiming@trans@CC}% {\PackageError{\@currname}{No 'CC' transition defined by the main tikz-timing package.}{}}% \tikztiming@iftrans{HC}% {\let\tikztiming@trans@H@normal@C\tikztiming@trans@HC}% {\PackageError{\@currname}{No 'HC' transition defined by the main tikz-timing package.}{}}% \tikztiming@iftrans{LC}% {\let\tikztiming@trans@L@normal@C\tikztiming@trans@LC}% {\PackageError{\@currname}{No 'LC' transition defined by the main tikz-timing package.}{}}% \tikztimingdef{CC}{% \code{\setcounter{tikztimingtrans}{-\value{tikztimingtrans}}} [timing/c/save] \newdraw [\style,timing/c/restore,>=\noexpand\tikztiming@c@arrow@tip,timing/c/arrow@style] -- ++(\slope*\noexpand\tikztiming@c@arrow@pos,\value{tikztimingtrans}*\height*\noexpand\tikztiming@c@arrow@pos) ; \draw [timing/restore,timing/c/restore] (timing@save) ++(0,0) [\style] -- ++(\slope,\value{tikztimingtrans}*\height) -- ++($ (#1,0) - (\slope,0) $) } \let\tikztiming@trans@C@arrow@C\tikztiming@trans@CC \tikztimingdef{HC}{% \code{\setcounter{tikztimingtrans}{-1}} [timing/c/save] \newdraw [\style,timing/c/restore,>=\noexpand\tikztiming@c@arrow@tip,timing/c/arrow@style] -- ++(\slope*\noexpand\tikztiming@c@arrow@pos,\value{tikztimingtrans}*\height*\noexpand\tikztiming@c@arrow@pos) ; \draw [timing/restore,timing/c/restore] (timing@save) ++(0,0) [\style] -- ++(\slope,\value{tikztimingtrans}*\height) -- ++($ (#1,0) - (\slope,0) $) } \let\tikztiming@trans@H@arrow@C\tikztiming@trans@HC \tikztimingdef{LC}{% \code{\setcounter{tikztimingtrans}{+1}} [timing/c/save] \newdraw [\style,timing/c/restore,>=\noexpand\tikztiming@c@arrow@tip,timing/c/arrow@style] -- ++(\slope*\noexpand\tikztiming@c@arrow@pos,\value{tikztimingtrans}*\height*\noexpand\tikztiming@c@arrow@pos) ; \draw [timing/restore,timing/c/restore] (timing@save) ++(0,0) [\style] -- ++(\slope,\value{tikztimingtrans}*\height) -- ++($ (#1,0) - (\slope,0) $) } \let\tikztiming@trans@L@arrow@C\tikztiming@trans@LC \tikzset{timing/c/.cd, rising arrows/.code={% \let\tikztiming@trans@CC\tikztiming@trans@C@arrow@C% \let\tikztiming@trans@LC\tikztiming@trans@L@arrow@C% \let\tikztiming@trans@HC\tikztiming@trans@H@arrow@C% \def\tikztiming@clockarrow@style{\ifnum1=\c@tikztimingtrans\tikzset{->,timing/c/arrow}\fi}% },% falling arrows/.code={% \let\tikztiming@trans@CC\tikztiming@trans@C@arrow@C% \let\tikztiming@trans@LC\tikztiming@trans@L@arrow@C% \let\tikztiming@trans@HC\tikztiming@trans@H@arrow@C% \def\tikztiming@clockarrow@style{\ifnum-1=\c@tikztimingtrans\tikzset{->,timing/c/arrow}\fi}% },% dual arrows/.code={% \let\tikztiming@trans@CC\tikztiming@trans@C@arrow@C% \let\tikztiming@trans@LC\tikztiming@trans@L@arrow@C% \let\tikztiming@trans@HC\tikztiming@trans@H@arrow@C% \def\tikztiming@clockarrow@style{\tikzset{->,timing/c/arrow}}% },% no arrows/.code={% \let\tikztiming@trans@CC\tikztiming@trans@C@normal@C% \let\tikztiming@trans@LC\tikztiming@trans@L@normal@C% \let\tikztiming@trans@HC\tikztiming@trans@H@normal@C% \def\tikztiming@clockarrow@style{}% },% arrow@style/.code={\tikztiming@clockarrow@style},% arrow/.style={},% arrow pos/.store in=\tikztiming@c@arrow@pos, arrow tip/.store in=\tikztiming@c@arrow@tip, save/.code={% \global\let\tikztiming@clockarrow@savedstyle\tikztiming@clockarrow@style \global\let\tikztiming@trans@saved@CC\tikztiming@trans@CC \global\let\tikztiming@c@arrow@savedpos\tikztiming@c@arrow@pos \global\let\tikztiming@c@arrow@savedtip\tikztiming@c@arrow@tip }, restore/.code={% \let\tikztiming@clockarrow@style\tikztiming@clockarrow@savedstyle \let\tikztiming@trans@CC\tikztiming@trans@saved@CC \let\tikztiming@c@arrow@pos\tikztiming@c@arrow@savedpos \let\tikztiming@c@arrow@tip\tikztiming@c@arrow@savedtip }, } \tikzset{timing/c/.cd, no arrows, arrow pos=0.95, arrow tip=to, } % \end{macrocode} % Use the \pkg{pgfopts} to handle the package options. % \begin{macrocode} \RequirePackage{pgfopts} \ProcessPgfOptions{/tikz/timing/c} % \end{macrocode} % \iffalse % % \fi % % \subsubsection{Arrows} % \iffalse %<*tikz-timing-arrows.sty> % \fi % \begin{macrocode} % \NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesPackage{tikz-timing-arrows}[% % % %<*DRIVER> 2099/01/01 develop % tikz-timing library for timing arrows] % \end{macrocode} % % This library is only defining the "A" and "W" basic transitions ("AA", "AW", "WA", "WW"). % While "W" is simply a copy of "A" with a different style. Both simple draw a line from |low| % to |high| and than move the position to the right according to the |width| value and back to % the |low| position. The different arrow directions are done by different styles. % \begin{macrocode} \tikzset{timing/.cd, A/.style={timing/a}, W/.style={timing/w}, a/.style={->}, w/.style={<-}, } \tikztimingchar{A}{++(0,0)}{% \newdraw [\style] -- ++(0,\height) \newdraw [timing/every char] ++(#1,-\height) } \def\tikztiming@nocombine@A{}% \tikztimingecopy{W}{A} % \end{macrocode} % % \iffalse % % \fi % % \subsubsection{Overlays} % \iffalse %<*tikz-timing-overlays.sty> % \fi % \begin{macrocode} % \NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesPackage{tikz-timing-overlays}[% % % %<*DRIVER> 2099/01/01 develop % tikz-timing library for timing overlays] % \end{macrocode} % % \begin{macro}{\tikztiming@defcode{O}} % The last character before the "O" is saved and restored. Also the drawing % state is saved and restored by the \cs{tikztiming@overlay@begin} and % \cs{tikztiming@overlay@end} macros. The parser end macro % \cs{tikztiming@parser@end} which is triggered at the end of the overlay string % is redefined to avoid problems. The double \TeX\ group is necessary because % the overlay string can close and reopen the inner \TeX\ % group. % \begin{macrocode} \tikztiming@defcode{O}#1{% \ifx\relax#1\empty \def\tikztiming@next{\tikztiming@parser#1}% \else \let\tikztiming@overlay@lastchar\tikztiming@lastchar \let\tikztiming@overlay@width\tikztimingwidth \tikztiming@output@addcode{\tikztiming@overlay@begin}% \begingroup \def\tikztiming@parser@end{% \def\tikztiming@output@nextchar{@}% \tikztiming@output@flush } \begingroup \tikztiming@parser #1\relax \endgroup \endgroup \tikztiming@output@addcode{\tikztiming@overlay@end}% \global\let\tikztiming@lastchar\tikztiming@overlay@lastchar \global\let\tikztimingwidth\tikztiming@overlay@width \def\tikztiming@next{\expandafter\tikztiming@parser\@firstofone}% \fi \tikztiming@next } % \end{macrocode} % \end{macro} % % Set the later expanded macros to some sane initial value. % \begin{macrocode} \let\tikztiming@overlay@save\empty \let\pgf@sh@nt@tikztiming@overlay@node\empty % \end{macrocode} % % \begin{macro}{\tikztiming@overlay@begin} % The drawing transition state (for "T", etc.) is saved and restored. % In order to be able to include an "O" inside the argument of another one the % overlay save node coordinates (\cs{pfg@sh@nt@tikztiming@overlay@node}) is also % saved and restored. The \cs{tikztiming@overlay@save} macro also includes an % self-assignment to its old version, which implements a stack. The macros must % be global because the overlay string can reopen a new TikZ path. % \begin{macrocode} \def\tikztiming@overlay@begin{ [/utils/exec={% \xdef\tikztiming@overlay@save{% \noexpand\global\noexpand\c@tikztimingtrans\the\c@tikztimingtrans\relax% \noexpand\global\noexpand\c@tikztimingtranspos\the\c@tikztimingtranspos\relax% \noexpand\gdef\noexpand\pgf@sh@nt@tikztiming@overlay@node {\csname pgf@sh@nt@tikztiming@overlay@node\endcsname}% \noexpand\gdef\noexpand\pgf@sh@nt@timing@refa {\csname pgf@sh@nt@timing@refa\endcsname}% \noexpand\gdef\noexpand\pgf@sh@nt@timing@refb {\csname pgf@sh@nt@timing@refb\endcsname}% \noexpand\gdef\noexpand\pgf@sh@nt@timing@ref {\csname pgf@sh@nt@timing@ref\endcsname}% \noexpand\gdef\noexpand\tikztiming@overlay@save{% \expandafter\unexpanded\expandafter{\tikztiming@overlay@save}% }% }% }]% node [timing/save] (tikztiming@overlay@node) {} }% % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@overlay@end} % Start new drawing path, restore position and saved drawing state. % \begin{macrocode} \def\tikztiming@overlay@end{% \tikztiming@newdraw (tikztiming@overlay@node) [/utils/exec={\tikztiming@overlay@save}] }% % \end{macrocode} % \end{macro} % % % \iffalse % % \fi % % \subsubsection{Column Type} % \iffalse %<*tikz-timing-columntype.sty> % \fi % \begin{macrocode} % \NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesPackage{tikz-timing-columntype}[% % % %<*DRIVER> 2099/01/01 develop % tikz-timing library for timing cell types] % \end{macrocode} % % The \pkg{array} package is needed to define the column type. % \begin{macrocode} \RequirePackage{array} \tikzset{timing/columntype/.code 2 args = \newcolumntype{#1}{>{\celltiming}#2<{\endcelltiming}}% }% % \end{macrocode} % % The options |type| (calls |timing/columntype|) and |notype| are defined. % \begin{macrocode} \RequirePackage{pgfopts} \tikzset{timing/columntype/.cd, type/.style 2 args={/tikz/timing/columntype={#1}{#2}},% notype/.code={}, notype/.value forbidden={}, } \ProcessPgfOptions{/tikz/timing/columntype} % \end{macrocode} % Use default settings if no options where given. This works because all options % so far will change the default type. % \begin{macrocode} \expandafter\ifx\csname opt@\@currname.\@currext\endcsname\empty \tikzset{timing/columntype={T}{l}}% \fi % \end{macrocode} % % \begin{macro}{\celltiming}[1]{Some ignored tokens} % The macro first reads everything to the |\ignorespaces| placed by the % |tabular|. After placing the tokens except |\ignorespaces| back a % |tikzpicture| is started. The \cs{tikztiming@endhook} is defined to call % \cs{end@celltiming}. % After the usual init process the input is tested for an optional argument and % \cs{tikztiming@celltiming} is called accordantly. % \begin{macrocode} \def\celltiming#1\ignorespaces{% #1% \begin{tikzpicture}[timing/picture,baseline={(0,0)}] \def\tikztiming@endhook{\end@celltiming} \tikztiming@init \let\tikztiming@settings\empty \@ifnextchar{[}% {\tikztiming@celltiming}% {\tikztiming@celltiming[]}% } \let\endcelltiming\relax % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@celltiming}[1]{Optional Initial Character or % Settings} % First the optional argument is tested to see if it is a single initial % character or some settings. The \cs{tikztiming@testoptarg} macro sets the % \cs{lastchar} and \cs{settings} macros to the appropriate values. % % If the \cs{lastchar} is empty it is set to the normal start value. % % Then a \pkg{pgf} scope with the potential user settings is started. The macros % |\unskip| and |\\| which are used internally by the |tabular| environment are % |\let| to |\relax| to work as end marker for the \cs{tikztiming@parser}. This % will not influence the table because they will revert to their original % definition at the end of the |tikzpicture| environment. % % Finally the \cs{tikztiming@parser} is called. % \begin{macrocode} \def\tikztiming@celltiming[#1]{% \ifx\relax#1\relax\else \tikztiming@testoptarg#1\relax\relax \fi \ifx\tikztiming@lastchar\empty \def\tikztiming@lastchar{@}% \fi \expandafter\scope\expandafter[\tikztiming@settings]% \begingroup \let\unskip\relax \let\\\relax \tikztiming@parser } % \end{macrocode} % \end{macro} % % \begin{macro}{\end@celltiming} % This macro is called from the \cs{tikztiming@endhook} which is located in % \cs{tikztiming@parser@end} when the end marker (|\relax| or alias) is % encountered. It executes the accumulated \cs{tikztiming@str} and places the % timing shape. Finally the |scope| and |tikzpicture| is closed. % \begin{macrocode} \def\end@celltiming{% \tikzset{timing/before}% \tikztiming@str; \expandafter\node \expandafter[\tikztiming@settings,shape=tikztiming@shape,anchor=origin] at (0,0) {}; \tikzset{timing/after}% \endscope \end{tikzpicture}% } % \end{macrocode} % \end{macro} % % \iffalse % % \fi % % \subsubsection{Nice Timing Tables} % \iffalse %<*tikz-timing-nicetabs.sty> % \fi % \begin{macrocode} % \NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesPackage{tikz-timing-nicetabs}[% % % %<*DRIVER> 2099/01/01 develop % tikz-timing library for nice timing tables] % \end{macrocode} % % The dimensions of the following packages are used. % \begin{macrocode} \RequirePackage{array} \RequirePackage{booktabs} % \end{macrocode} % % \begin{macro}{\tikztiming@nicetabs@tableheader}[1]{Optional Settings} % Calculate separator heights and set nodes appropriately, then call % the normal table header macro. % \begin{macrocode} \newcommand*\tikztiming@nicetabs@tableheader[1][]{% \path [timing/table/midrules] [/utils/exec=\xdef\@gtempa{\the\pgflinewidth}]; \path [timing/table/header,#1] let \p1 = (0,\belowrulesep + \aboverulesep + \@gtempa + \arraystretch\ht\strutbox + \arraystretch*\extrarowheight + \arraystretch\dp\strutbox) in coordinate (diagram@header) at (0,\y1) coordinate (label@header) at ($ -1*(\tikztiming@coldist,0) + (0,\y1) $) ; \tikztiming@normal@tableheader[#1]% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@nicetabs@tablerules}[1]{Optional Settings} % \begin{macrocode} \newcommand*\tikztiming@nicetabs@tablerules[1][]{% \begin{scope}[#1] \coordinate (NW) at (current bounding box.north west); \coordinate (SE) at (current bounding box.south east); % \draw [timing/table/rules] let \p1 = (NW), \p2 = (SE), \p3 = (last label.base), \p4 = ($ (0,\y3) - (0,\arraystretch\dp\strutbox + \aboverulesep + .5\pgflinewidth) $) in (\x1-\tabcolsep,\y4) -- (\x2+\tabcolsep,\y4) \iftikztiming@tablehead let \p5 = (diagram@header.base), \p6 = ($ (0,\y5) + (0,\arraystretch\ht\strutbox + \arraystretch*\extrarowheight + \belowrulesep + .5\pgflinewidth) $) in (\x1-\tabcolsep,\y6) -- (\x2+\tabcolsep,\y6) \fi ; \draw \iftikztiming@tablehead [timing/table/midrules] \else [timing/table/rules] \fi let \p1 = (NW), \p2 = (SE), \p3 = (0, \arraystretch\ht\strutbox + \arraystretch*\extrarowheight + \belowrulesep + .5\pgflinewidth) in (\x1-\tabcolsep, \y3) -- (\x2+\tabcolsep, \y3) ; \end{scope} } % \end{macrocode} % \end{macro} % % \begin{macrocode} \let\tikztiming@normal@tableheader\tikztiming@tableheader \let\tikztiming@normal@tablerules\tikztiming@tablerules \let\tikztiming@normal@coldist\tikztiming@coldist \let\tikztiming@normal@rowdist\tikztiming@rowdist \tikzset{% timing/no nice tabs/.code={% \let\tikztiming@coldist\tikztiming@normal@coldist \let\tikztiming@rowdist\tikztiming@normal@rowdist \let\tikztiming@tableheader\tikztiming@normal@tableheader \let\tikztiming@tablerules\tikztiming@normal@tablerules }, timing/nice tabs/.code={% \ifx\tikztiming@tableheader\tikztiming@nicetabs@tableheader\else \let\tikztiming@normal@coldist\tikztiming@coldist \let\tikztiming@normal@rowdist\tikztiming@rowdist \fi \def\tikztiming@rowdist{% \arraystretch\ht\strutbox +\arraystretch*\extrarowheight +\arraystretch\dp\strutbox }% \def\tikztiming@coldist{2\tabcolsep}% \let\tikztiming@tableheader\tikztiming@nicetabs@tableheader \let\tikztiming@tablerules\tikztiming@nicetabs@tablerules }, timing/nicetabs/no nice tabs/.style={/tikz/timing/no nice tabs}, timing/nicetabs/off/.style={/tikz/timing/no nice tabs}, timing/nicetabs/nice tabs/.style={/tikz/timing/nice tabs}, timing/nicetabs/on/.style={/tikz/timing/nice tabs}, } % \tikzset{timing/nice tabs}% % \end{macrocode} % % Use the \pkg{pgfopts} to handle the package options. % \begin{macrocode} \RequirePackage{pgfopts} \ProcessPgfOptions{/tikz/timing/nicetabs} % \end{macrocode} % \iffalse % % \fi % % \subsubsection{Counters} % \iffalse %<*tikz-timing-counters.sty> % \fi % \begin{macrocode} % \NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesPackage{tikz-timing-counters}[% % % %<*DRIVER> 2099/01/01 develop % tikz-timing library for counter values] % \end{macrocode} % % % \begin{macrocode} \newif\if@tikztiming@counter@wraps \tikzset{% timing/new counter/.style={timing/counter/new={#1}}, timing/counter/.cd, new/.code={\tikztiming@counter@new{#1}}, new/.value required, opt/.cd, char/.initial=, char/.value required, reset char/.initial=, reset char/.value required, reset type/.is choice, reset type/width/.code={\def\tikztiming@resettype{0}}, reset type/arg/.code={\def\tikztiming@resettype{1}}, reset type/both/.code={\def\tikztiming@resettype{2}}, reset type/Both/.code={\def\tikztiming@resettype{3}}, half width char/.initial=, half width char/.value required, base/.initial=10, base/.value required, increment/.initial=1, increment/.value required, max value/.initial=, max value/.value required, min value/.initial=, min value/.value required, wraps/.is if=@tikztiming@counter@wraps, digits/.initial=, digits/.value required, fg style/.initial=, bg style/.initial=, text style/.initial=, text format/.initial=, fg style/.value required, bg style/.value required, text style/.value required, text format/.value required, } \def\tikztiming@counter@textformat{}% % \end{macrocode} % % \begin{macro}{\tikztimingcounter}[1]{Counter Character} % \begin{macrocode} \def\tikztimingcounter#1{% \csname tikztiming@counter@#1\endcsname } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztimingsetcounter}[2]{Counter Character}{pgfmath expression} % \begin{macrocode} \def\tikztimingsetcounter#1#2{% \begingroup \pgfmathtruncatemacro\@tempa{#2}% \expandafter\global\expandafter\let\csname tikztiming@counter@#1\endcsname\@tempa \endgroup } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@counter@new}[1]{Styles} % Most parts of this macro is enclosed in a group to keep most changes locally. % \begin{macrocode} \def\tikztiming@counter@new#1{% \begingroup \def\tikztiming@resettype{0}% % \end{macrocode} % The argument is taken as pgf keys relative to the "/tikz/timing/counter/opt" path. % The counter character is mandatory and an error is raised if it is not defined. % \begin{macrocode} \pgfqkeys{/tikz/timing/counter/opt}{#1}% \tikzset{timing/counter/opt/char/.get=\counterchar}% \ifx\counterchar\empty \PackageError{tikz-timing-counters}{Counter character must be given using the 'char' key!}{}% \endgroup \else % \end{macrocode} % The counter boundary test code is now assembled in |\@tempb|. % If the "wraps" option was used the \cs{tikztiming@counter@wrap} macro is used with the % "min value" and "max value" as (expanded) arguments. % \begin{macrocode} \pgfkeys{/tikz/timing/counter/opt/min value/.get=\min}% \pgfkeys{/tikz/timing/counter/opt/max value/.get=\max}% \if@tikztiming@counter@wraps \ifx\min\empty \def\min{0}% \fi \ifx\max\empty \PackageError{tikz-timing-counters}{The option 'wraps' needs the option 'max value' to be set!}{}% \fi \def\@tempb{% \noexpand\tikztiming@counter@wrap% {\expandafter\unexpanded\expandafter{\min}}% {\expandafter\unexpanded\expandafter{\max}}% }% \else % \end{macrocode} % Otherwise either the \cs{tikztiming@counter@maxsat}, \cs{tikztiming@counter@minsat} or \cs{tikztiming@counter@minmaxsat} % macro is used if "max value", "min value" or both are set, respectively. % \begin{macrocode} \ifx\min\empty \ifx\max\empty \let\@tempb\empty \else \def\@tempb{% \noexpand\tikztiming@counter@maxsat% {\expandafter\unexpanded\expandafter{\max}}% }% \fi \else \ifx\max\empty \def\@tempb{% \noexpand\tikztiming@counter@minsat% {\expandafter\unexpanded\expandafter{\min}}% }% \else \def\@tempb{% \noexpand\tikztiming@counter@minmaxsat% {\expandafter\unexpanded\expandafter{\min}}% {\expandafter\unexpanded\expandafter{\max}}% }% \fi \fi \fi % \end{macrocode} % The counter styles are set up. % \begin{macrocode} \pgfkeys{/tikz/timing/counter/opt/fg style/.get=\fgstyle}% \pgfkeys{/tikz/timing/counter/opt/bg style/.get=\bgstyle}% \pgfkeys{/tikz/timing/counter/opt/text style/.get=\textstyle}% \pgfkeys{/tikz/timing/counter/opt/text format/.get=\textformat}% % \end{macrocode} % Finally the \cs{tikztiming@counter@new@} macro is called with most of the % settings as expanded arguments. % \begin{macrocode} \pgfkeys{/tikz/timing/counter/opt/increment/.get=\increment}% \edef\@tempa{% \noexpand\tikztiming@counter@new@ {\pgfkeysvalueof{/tikz/timing/counter/opt/char}}% {\pgfkeysvalueof{/tikz/timing/counter/opt/base}}% {\pgfkeysvalueof{/tikz/timing/counter/opt/half width char}}% {\pgfkeysvalueof{/tikz/timing/counter/opt/reset char}}% {\pgfkeysvalueof{/tikz/timing/counter/opt/digits}}% {\expandafter\unexpanded\expandafter{\increment}}% {\@tempb}% {\min}% {\tikztiming@resettype}% {\expandafter\unexpanded\expandafter{\fgstyle}}% {\expandafter\unexpanded\expandafter{\bgstyle}}% {\expandafter\unexpanded\expandafter{\textstyle}}% {\expandafter\unexpanded\expandafter{\textformat}}% }% \expandafter\expandafter\expandafter\endgroup \expandafter\@tempa \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@counter@new@}[9]{Character}{Base}{Half Width % Character}{Reset Character}{Number of Digits}{Increment}{Boundary Code}{Min Value}{Reset Type} % \begin{macrocode} \def\tikztiming@counter@new@#1#2#3#4#5#6#7#8#9{% \ifx\empty#8\empty \@namedef{tikztiming@counter@#1}{0}% \else \expandafter \pgfmathtruncatemacro\csname tikztiming@counter@#1\endcsname{#8}% \fi \tikztimingmetachar{#1}[1]{ { [timing/counter/#1] ##1D{[timing/counter/#1/text]\tikztiming@counter@vs{#1}{#2}{#5}{#6}{#7}} } }% \ifx\empty#3\empty \tikztiming@iflower{#1}{}% {\lowercase{\tikztimingmetachar{#1}}[1]% { { [timing/counter/#1] ##1d{[timing/counter/#1/text]\tikztiming@counter@vs{#1}{#2}{#5}{#6}{#7}}} }% }% \else \tikztimingmetachar{#3}[1]{% { [timing/counter/#1] ##1d{[timing/counter/#1/text]\tikztiming@counter@vs{#1}{#2}{#5}{#6}{#7}} }% }% \fi \ifx\empty#4\empty\else \ifcase0#9\relax \tikztimingmetachar{#4}[1]{[|/utils/exec=\tikztiming@counter@reset{#1}{##1}|]}% \or \tikztimingmetachar{#4}[2]{[|/utils/exec=\tikztimingsetcounter{#1}{##2}|]}% \or \uppercase{\tikztimingmetachar{#4}}[1]{[|/utils/exec=\tikztiming@counter@reset{#1}{##1}|]}% \lowercase{\tikztimingmetachar{#4}}[2]{[|/utils/exec=\tikztimingsetcounter{#1}{##2}|]}% \or \lowercase{\tikztimingmetachar{#4}}[1]{[|/utils/exec=\tikztiming@counter@reset{#1}{##1}|]}% \uppercase{\tikztimingmetachar{#4}}[2]{[|/utils/exec=\tikztimingsetcounter{#1}{##2}|]}% \fi \fi \tikztiming@counter@new@@{#1}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@counter@new@@}[5]{Character}{Foreground Style}{Background Style}{Text Style} % {Text format} % The counter styles are set up. % \begin{macrocode} \def\tikztiming@counter@new@@#1#2#3#4#5{% \tikzset{timing/counter/#1/.style={}}% \ifx\empty#2\empty\else \tikzset{timing/counter/#1/.append style={% /tikz/timing/d/.style={#2}% }}% \fi \ifx\empty#3\empty\else \tikzset{timing/counter/#1/.append style={% /tikz/timing/d/background/.style={#3}% }}% \fi \tikzset{timing/counter/#1/text/.style={#4}}% \ifx\empty#5\empty\else \tikzset{timing/counter/#1/.append style={% /utils/exec={\def\tikztiming@counter@textformat{#5}}% }}% \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@counter@reset}[2]{Character to Reset}{Reset value} % The counter is set first using pgf to round the value correctly and then again % with \cs{setcounter} to make it global. % \begin{macrocode} \def\tikztiming@counter@reset#1#2{% \begingroup \pgfmathtruncatemacro\@tempa{round((#2)/\tikztiming@wscale)}% \expandafter\global\expandafter\let\csname tikztiming@counter@#1\endcsname\@tempa \endgroup } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@counter@vs}[5]{Character}{Base}{Number of Digits}{Increment}{Boundary Code} % Note: \cs{pgfmathdectoBase} is only used for a base different to 10 to allow % negative number for decimal base. % \begin{macrocode} \def\tikztiming@counter@vs#1#2#3#4#5{% \begingroup \ifx\empty#3\empty\else \pgfmathsetbasenumberlength{#3}% \fi \ifnum#2=10 \expandafter\expandafter\expandafter\tikztiming@counter@textformat \expandafter\expandafter\expandafter{\csname tikztiming@counter@#1\endcsname}% \else \pgfmathdectoBase\pgfmathresult{\@nameuse{tikztiming@counter@#1}}{#2}% \expandafter\tikztiming@counter@textformat\expandafter{\pgfmathresult}% \fi \edef\N{\@nameuse{tikztiming@counter@#1}}% \pgfmathtruncatemacro\N{\N + #4}% #5% \expandafter\global\expandafter\let\csname tikztiming@counter@#1\endcsname\N \endgroup } % \end{macrocode} % \end{macro} % % The following macros checks the boundaries of the counter value. The value is stored in the % macro \cs{N}, the boundaries are provided as arguments. If necessary the value can be % adjusted by changing \cs{N}. All values are taken as \emph{integers}. % % \begin{macro}{\tikztiming@counter@minsat}[1]{Minimum Value} % \begin{macrocode} \def\tikztiming@counter@minsat#1{% \pgfmathtruncatemacro\MIN{#1}% \ifnum\N<\MIN \let\N\MIN \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@counter@maxsat}[1]{Maximum Value} % \begin{macrocode} \def\tikztiming@counter@maxsat#1{% \pgfmathtruncatemacro\MAX{#1}% \ifnum\N>\MAX \let\N\MAX \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@counter@minmaxsat}[2]{Minimum Value}{Maximum Value} % \begin{macrocode} \def\tikztiming@counter@minmaxsat#1#2{% \tikztiming@counter@minsat{#1}% \tikztiming@counter@maxsat{#2}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@counter@wrap}[2]{Minimum Value}{Maximum Value} % \begin{macrocode} \def\tikztiming@counter@wrap#1#2{% \pgfmathtruncatemacro\MIN{#1}% \pgfmathtruncatemacro\MAX{#2}% \ifnum\N>\MAX \pgfmathtruncatemacro\N{\MIN + (\N-\MAX-1)}% \fi \ifnum\N<\MIN \pgfmathtruncatemacro\N{\MAX - (\MIN-\N+1)}% \fi } % \end{macrocode} % \end{macro} % % Use the \pkg{pgfopts} to handle the package options. % \begin{macrocode} \RequirePackage{pgfopts} \ProcessPgfOptions{/tikz/timing/counter} % \end{macrocode} % \iffalse % % \fi % % \subsubsection{Advanced Nodes} % \iffalse %<*tikz-timing-advnodes.sty> % \fi % \begin{macrocode} % \NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesPackage{tikz-timing-advnodes}[% % % %<*DRIVER> 2099/01/01 develop % tikz-timing library for advanced nodes] % \end{macrocode} % % \begin{macrocode} \let\tikztiming@orig@oldnodecenter\tikztiming@oldnodecenter \tikzset{timing/nodes/.cd, simple/.code={% \let\tikztiming@oldnodecenter\tikztiming@orig@oldnodecenter \tikzset{% timing/inline node/.style={shape=coordinate}, }% }, advanced/.code={% \let\tikztiming@oldnodecenter\@gobble \tikzset{% timing/inline node/.style={shape=tikztiming coordinate}, timing/nodes/new center, }% }, old center/.code={% \let\tikztiming@nodecenteranchor\tikztiming@old@nodecenteranchor },% new center/.code={% \let\tikztiming@nodecenteranchor\empty },% } \tikzset{timing/nodes/.cd,advanced,new center} \def\anchoralias#1#2{% \expandafter\def \csname pgf@anchor@\pgf@sm@shape@name @#1\expandafter\endcsname \expandafter{\csname pgf@anchor@\pgf@sm@shape@name @#2\endcsname}% } \def\tikztiming@anchorpoint#1#2#3{% \pgf@xa=#2\relax \pgf@ya=#3\relax \expandafter\edef\csname#1\endcsname{% \pgf@x=\the\pgf@xa\relax \pgf@y=\the\pgf@ya\relax }% \expandafter\addtosavedmacro\csname#1\endcsname } % \end{macrocode} % % \begin{macro}{\tikztiming@tryanchor@}[2]{From}{To} % \begin{macrocode} \def\tikztiming@tryanchor#1#2{% \let\tikztiming@next\relax \ifnum\tikztiming@debug>2 \message{^^J Try Anchor: '#1' '#2' ^^J }% \def\tikztiming@next{\message{^^J TERM ^^J}}% \fi \ifx\relax#1\empty\else \ifx\relax#2\empty\else \def\tikztiming@next{% \@ifundefined{tikztiming@anchors@#1@#2}% {% \edef\@tempa{% {\csname tikztiming@alias@#1\endcsname}% {\csname tikztiming@alias@#2\endcsname}% }% \expandafter\tikztiming@tryanchor@\@tempa{#1}{#2}% }% {\let\tikztiming@tryanchor\@gobbletwo \ifnum\tikztiming@debug>2 \message{^^J Anchor: '#1' '#2' ^^J }% \fi \@nameuse{tikztiming@anchors@#1@#2}% }% }% \fi\fi \tikztiming@next } % \end{macrocode} % \end{macro} % % \begin{macro}{\tikztiming@tryanchor@}[4]{Alias From}{Alias To}{From}{To} % \begin{macrocode} \def\tikztiming@tryanchor@#1#2#3#4{% \tikztiming@tryanchor{#3}{#2}% \tikztiming@tryanchor{#1}{#4}% \tikztiming@tryanchor{#1}{#2}% \let\tikztiming@tryanchor@\@gobblefour \tikztiming@tryanchor{#3}{}% \tikztiming@tryanchor{}{#4}% } % \end{macrocode} % \end{macro} % % \begin{macrocode} \pgfdeclareshape{tikztiming coordinate}{% \savedmacro\anchorpoints{% \let\anchorpoint\tikztiming@anchorpoint \let\slope\@tempdima \let\dslope\@tempdimb \let\zslope\@tempdimc \let\height\pgf@yb \let\fromchar\tikztiming@node@fromchar \let\tochar\tikztiming@node@tochar % \ifnum\tikztiming@debug>2 \message{^^J Node: \fromchar \tochar ^^J}% \fi % \edef\@tempa{{timing/\tochar}}% \expandafter\lowercase\expandafter {\expandafter\tikzset\@tempa}% \pgfpointxy{\timingslope}{0}% \slope=\pgf@x\relax \pgfpointxy{\timingdslope}{0}% \dslope=\pgf@x\relax \pgfpointxy{\timingzslope}{0}% \zslope=\pgf@x\relax \pgfpointxy{0}{\timingheight}% \height=\pgf@y\relax \edef\anchorpoints{% \noexpand\pgf@yb=\the\height\relax \let\noexpand\height\noexpand\pgf@yb }% % \tikztiming@tryanchor{\fromchar}{\tochar}% } \savedanchor\lowpoint{% \pgfpointanchor{timing/start base}{center}% \pgf@x=0pt }% \anchor{origin}{% \pgfpointorigin \anchorpoints \@nameuse{originoffset} \pgf@x=-\pgf@x \pgf@y=-\pgf@y }% \anchor{old center}{% \pgfpointorigin \tikztiming@old@nodecenteranchor }% \anchor{new center}{\pgfpointorigin}% \anchor{center}{% \pgfpointorigin \tikztiming@nodecenteranchor }% \anchor{MID}{\tikztiming@useanchor{HIGH}\advance\pgf@y by -.5\height\relax }% \anchor{LOW}{\tikztiming@useanchor{HIGH}\advance\pgf@y by -\height\relax }% \anchor{HIGH}{\tikztiming@useanchor{HIGH}}% \anchor{TOP}{% \tikztiming@nodes@getoffset \tikztiming@useanchor{HIGH} \advance\pgf@y by \pgf@ya\relax }% \anchor{BOTTOM}{% \tikztiming@nodes@getoffset \tikztiming@useanchor{HIGH} \advance\pgf@y by -\pgf@ya\relax \advance\pgf@y by -\height\relax }% \anchor{mid}{\tikztiming@useanchor{mid}}% \anchor{low}{\tikztiming@useanchor{low}}% \anchor{high}{\tikztiming@useanchor{high}}% \anchor{low2}{\tikztiming@useanchor{low2}}% \anchor{high2}{\tikztiming@useanchor{high2}}% % \expandafter\anchorborder\expandafter{\csname pgf@anchor@\pgf@sm@shape@name @center\endcsname}% % \nodeparts{}% } \def\tikztiming@nodes@getoffset{% \begingroup \pgfpointxy{0}{1}% \pgfmathsetresultunitscale{\pgf@y}% \pgfpoint{0}{\tikztiming@nodes@offset}% \global\pgf@ya=\pgf@y \endgroup } \tikzset{% timing/nodes/.cd, offset/.store in=\tikztiming@nodes@offset, offset=0.25, } \def\tikztiming@nodecenteranchor{} \def\tikztiming@old@nodecenteranchor{% \anchorpoints \@ifundefined{oldcenter}% {\@nameuse{originoffset}% \pgf@x=-\pgf@x\relax \pgf@y=-\pgf@y\relax }% {\@nameuse{oldcenter}}% } \def\tikztiming@useanchor#1{% \anchorpoints \@ifundefined{#1}% {\PackageError{tikz-timing}% {No such anchor '#1' defined for this transition!}{}% \pgfpointorigin }% {\@nameuse{#1}}% } \tikzset{% every tikztiming coordinate node/.style={anchor=origin}, } % \end{macrocode} % \begin{macrocode} \def\tikztiming@anchors#1#2{% \@namedef{tikztiming@anchors@#1@#2}% } \def\tikztiming@anchorslet#1#2#3#4{% \expandafter\let \csname tikztiming@anchors@#1@#2\expandafter\endcsname \csname tikztiming@anchors@#3@#4\endcsname } \tikztiming@anchors{@}{D}{% \anchorpoint{originoffset}{0pt}{.5\height}% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{high}{0pt}{.5\height}% \anchorpoint{low}{0pt}{-.5\height}% \anchorpoint{HIGH}{0pt}{.5\height}% } \tikztiming@anchors{@}{H}{% \anchorpoint{originoffset}{0pt}{\height}% \anchorpoint{high}{0pt}{0pt}% \anchorpoint{HIGH}{0pt}{0pt}% } \tikztiming@anchors{@}{L}{% \anchorpoint{originoffset}{0pt}{0pt}% \anchorpoint{low}{0pt}{0pt}% \anchorpoint{HIGH}{0pt}{\height}% } \tikztiming@anchors{@}{T}{% \anchorpoint{originoffset}{0pt}{0pt}% \anchorpoint{low}{0pt}{0pt}% \anchorpoint{HIGH}{0pt}{\height}% } \tikztiming@anchors{@}{Z}{% \anchorpoint{originoffset}{0pt}{.5\height}% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{HIGH}{0pt}{.5\height}% } \tikztiming@anchors{D}{D}{% \anchorpoint{originoffset}{0pt}{0pt}% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{HIGH}{0pt}{.5\height}% \anchorpoint{high}{0pt}{.5\height}% \anchorpoint{low}{0pt}{-.5\height}% } \tikztiming@anchors{L}{H}{% \anchorpoint{originoffset}{.5\slope}{.5\height}% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{high}{.5\slope}{.5\height}% \anchorpoint{low}{-.5\slope}{-.5\height}% \anchorpoint{HIGH}{-.5\slope}{.5\height}% } \tikztiming@anchors{E}{H}{% \anchorpoint{originoffset}{-.5\slope}{-.5\height}% \anchorpoint{oldcenter}{-.5\slope}{-.5\height}% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{high}{.5\slope}{.5\height}% \anchorpoint{low}{-.5\slope}{-.5\height}% \anchorpoint{HIGH}{-.5\slope}{.5\height}% } \tikztiming@anchors{T}{T}{% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{HIGH}{-.5\slope}{.5\height}% \ifnum 1=\c@tikztimingtrans \anchorpoint{originoffset}{.5\slope}{-.5\height}% \anchorpoint{high}{-.5\slope}{.5\height}% \anchorpoint{low}{.5\slope}{-.5\height}% \else \anchorpoint{originoffset}{.5\slope}{.5\height}% \anchorpoint{high}{.5\slope}{.5\height}% \anchorpoint{low}{-.5\slope}{-.5\height}% \fi } \tikztiming@anchorslet{T}{E}{T}{T}% \tikztiming@anchors{T}{@}{% \ifnum 1=\c@tikztimingtrans \anchorpoint{high}{0pt}{0pt}% \anchorpoint{HIGH}{0pt}{0pt}% \else \anchorpoint{low}{0pt}{0pt}% \anchorpoint{HIGH}{0pt}{\height}% \fi } \tikztiming@anchors{H}{H}{% \anchorpoint{originoffset}{0pt}{0pt}% \anchorpoint{high}{0pt}{0pt}% \anchorpoint{HIGH}{0pt}{0pt}% } \tikztiming@anchors{L}{L}{% \anchorpoint{originoffset}{0pt}{0pt}% \anchorpoint{low}{0pt}{0pt}% \anchorpoint{HIGH}{0pt}{\height}% } \tikztiming@anchors{Z}{Z}{% \anchorpoint{originoffset}{0pt}{0pt}% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{HIGH}{0pt}{.5\height}% } \tikztiming@anchors{E}{E}{% \anchorpoint{mid}{0pt}{0pt}% \ifnum 1=\c@tikztimingtrans \anchorpoint{originoffset}{.5\slope}{.5\height}% \anchorpoint{HIGH}{-.5\slope}{.5\height}% \anchorpoint{high}{.5\slope}{.5\height}% \anchorpoint{low}{-.5\slope}{-.5\height}% \else \anchorpoint{originoffset}{-.5\slope}{.5\height}% \anchorpoint{oldcenter}{-.5\slope}{-.5\height}% \anchorpoint{HIGH}{-.5\slope}{.5\height}% \anchorpoint{high}{-.5\slope}{.5\height}% \anchorpoint{low}{.5\slope}{-.5\height}% \fi } \tikztiming@anchors{H}{L}{% \anchorpoint{originoffset}{.5\slope}{-.5\height}% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{high}{-.5\slope}{.5\height}% \anchorpoint{HIGH}{-.5\slope}{.5\height}% \anchorpoint{low}{.5\slope}{-.5\height}% } \tikztiming@anchorslet{H}{E}{H}{L}% \tikztiming@anchors{E}{L}{% \anchorpoint{originoffset}{-.5\slope}{.5\height}% \anchorpoint{oldcenter}{-.5\slope}{-.5\height}% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{high}{-.5\slope}{.5\height}% \anchorpoint{HIGH}{-.5\slope}{.5\height}% \anchorpoint{low}{.5\slope}{-.5\height}% } \tikztiming@anchors{E}{T}{% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{HIGH}{-.5\slope}{.5\height}% \ifnum 1=\c@tikztimingtrans \anchorpoint{originoffset}{-.5\slope}{-.5\height}% \anchorpoint{oldcenter}{-.5\slope}{-.5\height}% \anchorpoint{high}{.5\slope}{.5\height}% \anchorpoint{low}{-.5\slope}{-.5\height}% \else \anchorpoint{originoffset}{-.5\slope}{.5\height}% \anchorpoint{oldcenter}{-.5\slope}{-.5\height}% \anchorpoint{high}{-.5\slope}{.5\height}% \anchorpoint{low}{.5\slope}{-.5\height}% \fi } \tikztiming@anchors{E}{Z}{% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{oldcenter}{-\zslope}{-.5\height}% \anchorpoint{HIGH}{-\zslope}{.5\height}% \anchorpoint{high}{-\zslope}{.5\height}% \anchorpoint{low}{-\zslope}{-.5\height}% } \tikztiming@anchors{Z}{D}{% \anchorpoint{originoffset}{0pt}{0pt}% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{HIGH}{0pt}{.5\height}% \anchorpoint{high}{.5\dslope}{.5\height}% \anchorpoint{low}{.5\dslope}{-.5\height}% } \tikztiming@anchors{D}{Z}{% \anchorpoint{originoffset}{0pt}{0pt}% \anchorpoint{oldcenter}{-.5\dslope}{-.5\height}% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{HIGH}{-.5\dslope}{.5\height}% \anchorpoint{high}{-.5\dslope}{.5\height}% \anchorpoint{low}{-.5\dslope}{-.5\height}% } \tikztiming@anchors{D}{H}{% \anchorpoint{originoffset}{0pt}{0pt}% \anchorpoint{oldcenter}{-.5\dslope}{-.5\height}% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{HIGH}{-.5\dslope}{.5\height}% \anchorpoint{high}{.5\dslope}{.5\height}% \anchorpoint{high2}{-.5\dslope}{.5\height}% \anchorpoint{low}{-.5\dslope}{-.5\height}% } \tikztiming@anchors{D}{L}{% \anchorpoint{originoffset}{0pt}{0pt}% \anchorpoint{oldcenter}{-.5\dslope}{-.5\height}% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{HIGH}{-.5\dslope}{.5\height}% \anchorpoint{high}{-.5\dslope}{.5\height}% \anchorpoint{low2}{-.5\dslope}{-.5\height}% \anchorpoint{low}{.5\dslope}{-.5\height}% } \tikztiming@anchorslet{D}{T}{D}{L}% \tikztiming@anchors{D@edge@}{D}{% \anchorpoint{originoffset}{0pt}{0pt}% \anchorpoint{oldcenter}{-.5\dslope}{-.5\height}% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{HIGH}{-.5\dslope}{.5\height}% \anchorpoint{high}{-.5\dslope}{.5\height}% \anchorpoint{high2}{.5\dslope}{.5\height}% \anchorpoint{low}{-.5\dslope}{-.5\height}% \anchorpoint{low2}{.5\dslope}{-.5\height}% } \tikztiming@anchorslet{D}{U}{D@edge@}{D} \tikztiming@anchorslet{U}{D}{D@edge@}{D} \tikztiming@anchorslet{D}{D@edge@}{D@edge@}{D} \tikztiming@anchorslet{D@edge@}{D@edge@}{D@edge@}{D} \tikztiming@anchorslet{D}{E}{D@edge@}{D} \tikztiming@anchorslet{E}{D}{D@edge@}{D} \tikztiming@anchorslet{L}{E}{L}{H}% \tikztiming@anchorslet{L}{T}{L}{H}% \tikztiming@anchorslet{H}{T}{H}{L}% \tikztiming@anchorslet{T}{H}{H}{L}% \tikztiming@anchors{D}{D}{% \anchorpoint{originoffset}{0pt}{0pt}% \anchorpoint{oldcenter}{0pt}{-.5\height}% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{high}{0pt}{.5\height}% \anchorpoint{low}{0pt}{-.5\height}% \anchorpoint{HIGH}{0pt}{.5\height}% } \tikztiming@anchorslet{D}{@}{D}{D} \tikztiming@anchorslet{E}{@}{D}{D} \tikztiming@anchorslet{U}{U}{D}{D} \tikztiming@anchorslet{@}{E}{@}{D} \tikztiming@anchors{L}{D}{% \anchorpoint{originoffset}{.5\dslope}{.5\height}% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{high}{.5\dslope}{.5\height}% \anchorpoint{low}{-.5\dslope}{-.5\height}% \anchorpoint{low2}{.5\dslope}{-.5\height}% \anchorpoint{HIGH}{-.5\dslope}{.5\height}% } \tikztiming@anchors{T}{D}{% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{HIGH}{-.5\dslope}{.5\height}% \ifnum 1=\c@tikztimingtrans \anchorpoint{originoffset}{.5\dslope}{-.5\height}% \anchorpoint{high}{-.5\dslope}{.5\height}% \anchorpoint{high2}{.5\dslope}{.5\height}% \anchorpoint{low}{.5\dslope}{-.5\height}% \else \anchorpoint{originoffset}{.5\dslope}{.5\height}% \anchorpoint{high}{.5\dslope}{.5\height}% \anchorpoint{low}{-.5\dslope}{-.5\height}% \anchorpoint{low2}{.5\dslope}{-.5\height}% \fi } \tikztiming@anchors{H}{D}{% \anchorpoint{originoffset}{.5\dslope}{-.5\height}% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{HIGH}{-.5\dslope}{.5\height}% \anchorpoint{high}{-.5\dslope}{.5\height}% \anchorpoint{high2}{.5\dslope}{.5\height}% \anchorpoint{low}{.5\dslope}{-.5\height}% } \tikztiming@anchors{Z}{E}{% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{high}{\zslope}{.5\height}% \anchorpoint{low}{\zslope}{-.5\height}% \anchorpoint{HIGH}{0pt}{.5\height}% } \tikztiming@anchors{Z}{H}{% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{high}{\zslope}{.5\height}% \anchorpoint{HIGH}{0pt}{.5\height}% } \tikztiming@anchors{Z}{T}{% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{HIGH}{0pt}{.5\height}% \ifnum1=\c@tikztimingtrans\relax \anchorpoint{low}{\zslope}{-.5\height}% \else \anchorpoint{high}{\zslope}{.5\height}% \fi } \tikztiming@anchors{T}{H}{% \ifnum1=\c@tikztimingtrans\relax \anchorpoint{high}{0pt}{0pt}% \anchorpoint{HIGH}{0pt}{0pt}% \else \anchorpoint{originoffset}{.5\slope}{.5\height}% \anchorpoint{low}{-.5\slope}{-.5\height}% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{high}{.5\slope}{.5\height}% \anchorpoint{HIGH}{-.5\slope}{.5\height}% \fi } \tikztiming@anchors{T}{L}{% \ifnum1=\c@tikztimingtrans\relax \anchorpoint{originoffset}{.5\slope}{-.5\height}% \anchorpoint{low}{.5\slope}{-.5\height}% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{high}{-.5\slope}{.5\height}% \anchorpoint{HIGH}{-.5\slope}{.5\height}% \else \anchorpoint{low}{0pt}{0pt}% \anchorpoint{HIGH}{0pt}{\height}% \fi } \tikztiming@anchors{T}{Z}{% \ifnum1=\c@tikztimingtrans\relax \anchorpoint{high}{0pt}{0pt}% \anchorpoint{mid}{\zslope}{-.5\height}% \anchorpoint{HIGH}{0pt}{0pt}% \else \anchorpoint{low}{0pt}{0pt}% \anchorpoint{mid}{\zslope}{.5\height}% \anchorpoint{HIGH}{0pt}{\height}% \fi } \tikztiming@anchors{Z}{L}{% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{low}{\zslope}{-.5\height}% \anchorpoint{HIGH}{0pt}{.5\height}% } \tikztiming@anchors{H}{Z}{% \anchorpoint{high}{0pt}{0pt}% \anchorpoint{mid}{\zslope}{-.5\height}% \anchorpoint{HIGH}{0pt}{0pt}% } \tikztiming@anchors{L}{Z}{% \anchorpoint{low}{0pt}{0pt}% \anchorpoint{mid}{\zslope}{.5\height}% \anchorpoint{HIGH}{0pt}{\height}% } \tikztiming@anchors{Z}{Z}{% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{HIGH}{0pt}{.5\height}% } \tikztiming@anchors{H}{@}{% \anchorpoint{high}{0pt}{0pt}% \anchorpoint{HIGH}{0pt}{0pt}% } \tikztiming@anchors{L}{@}{% \anchorpoint{low}{0pt}{0pt}% \anchorpoint{HIGH}{0pt}{\height}% } \tikztiming@anchors{Z}{@}{% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{HIGH}{0pt}{.5\height}% } \tikztiming@anchors{}{@}{% \anchorpoint{originoffset}{0pt}{.5\height}% \anchorpoint{mid}{0pt}{0pt}% \anchorpoint{high}{0pt}{.5\height}% \anchorpoint{low}{0pt}{-.5\height}% \anchorpoint{HIGH}{0pt}{.5\height}% } % \end{macrocode} % % Use the \pkg{pgfopts} to handle the package options. % \begin{macrocode} \RequirePackage{pgfopts} \ProcessPgfOptions{/tikz/timing/node} % \end{macrocode} % \iffalse % % \fi % % \subsubsection{Intervals} % \iffalse %<*tikz-timing-interval.sty> % \fi % \begin{macrocode} % \NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesPackage{tikz-timing-interval}[% % % %<*DRIVER> 2099/01/01 develop % tikz-timing library for alternative Z transitions] % \end{macrocode} % % \begin{macrocode} \let\tikztiming@linterval\relax \let\tikztiming@rinterval\relax \tikztimingdef{LZ}{ \tikztiming@rinterval {\newdraw [\style]} {-- ++(\zslope,+\height/2.)} -- ++($ (#1,0) - (\zslope,0) $) } \tikztimingdef{HZ}{% \tikztiming@rinterval {\newdraw [\style]} {-- ++(\zslope,-\height/2.)} -- ++($ (#1,0) - (\zslope,0) $) } \tikztimingdef{TZ}{% \code{\setcounter{tikztimingtrans}{-\value{tikztimingtrans}}} \tikztiming@rinterval {\newdraw [\style]} {-- ++(\zslope,\value{tikztimingtrans}*\height/2.)} -- ++($ (#1,0) - (\zslope,0) $) } \tikztimingdef{ZL}{% \tikztiming@linterval {\newdraw} {-- ++(\zslope,-\height/2.)} -- ++($ (#1,0) - (\zslope,0) $) } \tikztimingdef{ZH}{% \tikztiming@linterval {\newdraw} {-- ++(\zslope,\height/2.)} -- ++($ (#1,0) - (\zslope,0) $) } \tikztimingdef{ZT}{% \code{\setcounter{tikztimingtrans}{-\value{tikztimingtrans}}} \tikztiming@linterval {\newdraw [\style]} {-- ++(\zslope,\value{tikztimingtrans}*\height/2.)} -- ++($ (#1,0) - (\zslope,0) $) } \def\tikztiming@onetwo#1#2{#1#2} \def\tikztiming@twoone#1#2{#2#1} \let\tikztiming@linterval\tikztiming@onetwo \let\tikztiming@rinterval\tikztiming@onetwo \tikzset{timing/interval/.code={\pgfqkeys{/tikz/timing/interval}{#1}}} \tikzset{timing/interval/.cd, lo/.style={/tikz/timing/interval/left open}, lc/.style={/tikz/timing/interval/left close}, ro/.style={/tikz/timing/interval/right open}, rc/.style={/tikz/timing/interval/right close}, left close/.code={\let\tikztiming@linterval\tikztiming@onetwo}, left open/.code={\let\tikztiming@linterval\tikztiming@twoone}, right open/.code={\let\tikztiming@rinterval\tikztiming@onetwo}, right close/.code={\let\tikztiming@rinterval\tikztiming@twoone}, } \tikzset{ timing/interval/normal/.style={/tikz/timing/interval/left close,/tikz/timing/interval/right open}, timing/interval/verilog/.style={/tikz/timing/interval/normal}, timing/interval/metachar/.style={/tikz/timing/metachar={#1}[2]{[timing/interval={##2}]}}, } % \end{macrocode} % \iffalse % % \fi % % \subsubsection{Beamer Overlay Support} % \iffalse %<*tikz-timing-beamer.sty> % \fi % \begin{macrocode} % \NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesPackage{tikz-timing-beamer}[% % % %<*DRIVER> 2099/01/01 develop % tikz-timing library for beamer overlay support] % \end{macrocode} % % Experimental library for marginal beamer overlay support. It will change in future versions. Use at own risk! % \begin{macrocode} \PackageWarning{\@currname}{This library is experimental and will change in future versions!}{}{} \tikztiming@defcode<#1>{ \tikztiming@output@addcode{ node [timing/save] (timing@save) {};% \onslide<#1> \draw [timing/restore] (timing@save) ++(0,0) } \tikztiming@parser } % \end{macrocode} % \iffalse % % \fi % % \subsubsection{Compatibility with \protect\pkg{ifsym} Macros} % \iffalse %<*tikz-timing-ifsym.sty> % \fi % \begin{macrocode} % \NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesPackage{tikz-timing-ifsym}[% % % %<*DRIVER> 2099/01/01 develop % tikz-timing library for ifsym compatible macros] % \end{macrocode} % % % Set up styles to match behaviour of \pkg{ifsym}. Slope and size is is adjusted. % The macros only have 60\% of the height. % \begin{macrocode} \tikzset{% timing/ifsym/macro/.style={/tikz/timing/ifsym,/utils/exec={\pgfmathparse{.6*\f@size}\let\ysize\pgfmathresult},/tikz/y=\ysize}, timing/ifsym/.style={% /tikz,timing/slope=0,x=\f@size,y=\f@size,line width=0.1ex, % \end{macrocode} % Define "|" to create a glitch. While it can be ignored in "H|L" or "L|H" it can % also be used like "L|L" and "H|H". % \begin{macrocode} timing/metachar={|}{G}, % \end{macrocode} % The "X" is used for "M" and is set to black. % \begin{macrocode} timing/x/.style={}, % \end{macrocode} % Define "M"/"m" to be equal to "X"/"x": % \begin{macrocode} timing/metachar={M}[1]{#1X}, timing/metachar={m}[1]{#1x}, % \end{macrocode} % % Code changes: % \begin{macrocode} /utils/exec={% % \end{macrocode} % % The |setdslope| macro is redefined to allow value higher than 1. % \begin{macrocode} \def\tikztimingsetdslope##1{% \pgfmathparse{max(0.0,##1)}% \let\tikztiming@dslope\pgfmathresult \edef\timingdslope{\tikztiming@dslope*\noexpand\timingwidth}% } % \end{macrocode} % % The "<" and ">" characters are defined as code characters. They % check if there appear twice which doubles their width. % A macro is used to remove the second appearance from the input. % \begin{macrocode} \tikztiming@defcode{<}{% \@ifnextchar{<}% {\tikztiming@ifsym@longslope{X}{D}}% {\tikztiming@parser [timing/dslope=1] 0Xd;}% }% \tikztiming@defcode{>}{% \@ifnextchar{>}% {\tikztiming@ifsym@longslope{D}{X}}% {\tikztiming@parser [timing/dslope=1] 0Dx;}% }% \def\tikztiming@ifsym@longslope##1##2##3{ \tikztiming@parser [timing/dslope=2.] 0##1 ##2;% }% % \end{macrocode} % \begin{macrocode} }}, } % \end{macrocode} % % Define library options. % \begin{macrocode} \tikzset{% timing/ifsym/.cd, provide/.code={\let\tikztiming@ifsym@def\providecommand}, renew/.code={\let\tikztiming@ifsym@def\renewcommand}, new/.code={\let\tikztiming@ifsym@def\newcommand}, off/.code={\let\tikztiming@ifsym@def\@gobbletwo}, } % \end{macrocode} % % Execute library options. % \begin{macrocode} \tikzset{timing/ifsym/provide}% \RequirePackage{pgfopts} \ProcessPgfOptions{/tikz/timing/ifsym} % \end{macrocode} % % Provide all timing symbol macros from |[electronic]{ifsym}|: % \begin{macrocode} \tikztiming@ifsym@def{\RaisingEdge}{\hbox{\texttiming[timing/ifsym/macro]{.4L .4H}}} \tikztiming@ifsym@def{\FallingEdge}{\hbox{\texttiming[timing/ifsym/macro]{.4H .4L}}} \tikztiming@ifsym@def{\ShortPulseHigh}{\hbox{\texttiming[timing/ifsym/macro]{.4L .2H .4L}}} \tikztiming@ifsym@def{\ShortPulseLow}{\hbox{\texttiming[timing/ifsym/macro]{.4H .2L .4H}}} \tikztiming@ifsym@def{\PulseHigh}{\hbox{\texttiming[timing/ifsym/macro]{.4L .6H .4L}}} \tikztiming@ifsym@def{\PulseLow}{\hbox{\texttiming[timing/ifsym/macro]{.4H .6L .4H}}} \tikztiming@ifsym@def{\LongPulseHigh}{\hbox{\texttiming[timing/ifsym/macro]{.4L H .4L}}} \tikztiming@ifsym@def{\LongPulseLow}{\hbox{\texttiming[timing/ifsym/macro]{.4H L .4H}}} % \end{macrocode} % % Provide \cs{textifsym} macro: % \begin{macro}{\textifsym} % \begin{macrocode} \tikztiming@ifsym@def{\textifsym}{\texttiming[timing/ifsym]} % \end{macrocode} % \end{macro} % % Clean-up: % \begin{macrocode} \let\tikztiming@ifsym@def\@undefined % \end{macrocode} % \iffalse % % \fi % % % \Finale % \endinput