tikz-timing: existe uma maneira direta de adicionar um eixo de tempo numerado?

tikz-timing: existe uma maneira direta de adicionar um eixo de tempo numerado?

Adorei o tikz-timing por preparar diagramas de tempo para minhas aulas. Porém, uma coisa que não consegui descobrir é como adicionar um eixo de tempo numerado a um diagrama de tempo. Isso é útil ao mostrar os fundamentos do design do testbench e ao desejar indicar a correspondência no diagrama com uma linha na fonte Verilog. Imagino que uma sobreposição do TikZ possa funcionar, mas não sou muito profissional e preferiria algo em que os números fossem adicionados automaticamente. Estou usando as linhas de ajuda verticais, então, de alguma forma, adicionar números acima ou abaixo delas seria ótimo.

Responder1

Não há macro dedicada fornecida por tikz-timing, mas é possível desenhar esse eixo rotulado usando as macros de tamanho e os nós fornecidos.

O número de linhas é dado por \nrowse a linha mais larga por \twidth. As linhas também são fornecidas como nós chamados row<number>e o último nó da linha também é nomeado last row. Para desenhar material extra coloque o código de desenho em um extracodeambiente após a última linha conforme mostrado no exemplo abaixo. Consulte o manual tikz-timingpara obter mais detalhes.

\documentclass[border=2mm]{standalone}
\usepackage{tikz-timing}
\begin{document}
\begin{tikztimingtable}
 clk  &  20{C}   \\
 sig  &   5{HLZD{}}  \\
\begin{extracode}
 \begin{background}
  \vertlines[help lines]{}
  \horlines[help lines]{}
  \show\horlines
  \draw [->,>=latex] (0,-\nrows-1) -- (\twidth+1,-\nrows-1);
  \foreach \n in {0,1,...,\twidth}
    \draw (\n,-\nrows-1+.1) -- +(0,-.2)
        node [below,inner sep=2pt] {\scalebox{.75}{\tiny\n}};
 \end{background}
 %\tablegrid
\end{extracode}
\end{tikztimingtable}%
\end{document}

Resultado


Se precisar disso com mais frequência, você pode definir uma macro própria:

\documentclass[border=2mm,png]{standalone}
\usepackage{tikz-timing}

\newcommand{\timingaxis}[1][]{%
  \begin{scope}[#1]
  \draw [timing/table/axis] (0,-\nrows-1) -- (\twidth+1,-\nrows-1);
  \foreach \n in {0,1,...,\twidth} {
    \draw [timing/table/axis ticks]
        (\n,-\nrows-1+.1) -- +(0,-.2)
        node [below,inner sep=2pt] {\scalebox{.75}{\tiny\n}};
  }
  \end{scope}
}
\tikzset{%
    timing/table/axis/.style={->,>=latex},
    timing/table/axis ticks/.style={},
}

\begin{document}
\begin{tikztimingtable}
 clk  &  20{C}   \\
 sig  &   5{HLZD{}}  \\
\begin{extracode}
    \timingaxis\relax
\end{extracode}
\end{tikztimingtable}%
\end{document}

Responder2

Aqui está outra forma possível, usando pgfplotse o axismeio ambiente; ficaria assim:

teste_pdf

... usando este MWE:

\documentclass{standalone}
\usepackage{pgfplots}
\usepackage{tikz}
\usepackage{tikz-timing}
\usetikzlibrary{intersections} %% named intersections
\usetikzlibrary{fit}
\usetikzlibrary{calc}

\makeatletter
% http://tex.stackexchange.com/questions/33703/extract-x-y-
\newcommand{\gettikzxy}[3]{%
  \tikz@scan@one@point\pgfutil@firstofone#1\relax
  \edef#2{\the\pgf@x}%
  \edef#3{\the\pgf@y}%
}
\makeatother

\begin{document}

\begin{tikzpicture}[timing/picture]%,timing/nodes/advanced]
\begin{axis}[clip=false,ymin = 0, ymax = 2, xmin = 0, xmax = 5]

 %\addplot [] node [] (origin) at (0,0) {}; %no
\addplot [] coordinates {(0,0)};
\node[] (refsize) at ({axis cs:1,1}) {};

\pgfplotsextra{ % must have, else \gettikzxy will not work!
\gettikzxy{(refsize)}{\rx}{\ry}
% re-convert \rx back to length, so can scale it directly in style= below:
\newlength{\trx}
\setlength{\trx}{\rx}
\typeout{rx \rx - \the\trx, ry \ry}

\timing[very thick,style={x=0.5\trx,y=\ry},name=tgraph1] at ({axis cs:1,0.5}) { HLHLHL };

% debug:
% add frame border around tgraph1
\node[fit=(tgraph1), draw, color=gray] {};
% indicate origin of tgraph1 (is lower left corner):
\node[fill,circle,color=gray] at (tgraph1.origin) {};
} % end \pgfplotsextra

\end{axis}
\end{tikzpicture}

\end{document}

Observe que é necessário fazer um pouco de aritmética, para dimensionar as unidades do \timinggráfico para as unidades mostradas no gráfico - talvez meu exemplo acima não esteja alinhado com pixels perfeitos, mas pelo menos não parece tudo tão difícil de configurar...

informação relacionada