Created
July 22, 2017 22:13
-
-
Save disconnect3d/586d6b1565790fab50a7cf8c6599cd72 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
NODE_START = 4 | |
NODE_WIDTH = 6 | |
NODE_START_X = 1 # left of node | |
NODE_START_Y = 1 # bottom of node | |
NODE_SHORT_HEIGHT = 1 | |
NODE_LONG_HEIGHT = 1.5 | |
NODE_IS_LONG_AFTER_LEN = 30 | |
NODE_FMT = r' \draw ({x1},{y1}) rectangle ({x2},{y2}) node[pos=.5] {{{txt}}};' | |
nodes = [ | |
r'...', | |
r'zmienne lokalne \C{Bar}', | |
r'argumenty funkcji \C{Bar}', | |
r'zapisany wskaźnik ramki stosu', | |
r'zapisany wskaźnik instrukcji', | |
r'zmienne lokalne Foo', | |
r'zapisany wskaźnik ramki stosu', | |
r'zapisany wskaźnik instrukcji', | |
r'...' | |
] | |
# Braces require: `\usetikzlibrary{decorations.pathreplacing}` | |
# (node_from_idx, node_to_idx, msg) | |
braces = [ | |
(1, 4, 'Ramka stosu funkcji Bar'), | |
(5, 7, 'Ramka stosu funkcji Foo') | |
] | |
print(r''' | |
\begin{figure}[!h] | |
\centering | |
\caption{TODO FIXME} | |
\label{fig:TODO FIXME} | |
\begin{tikzpicture}[] | |
\centering''') | |
x1 = NODE_START_X | |
x2 = NODE_START_X + NODE_WIDTH | |
y1 = NODE_START_Y | |
y2 = y1 + NODE_SHORT_HEIGHT if len(nodes[0]) <= NODE_IS_LONG_AFTER_LEN else NODE_LONG_HEIGHT | |
widths = [] | |
for node in nodes: | |
dy = NODE_SHORT_HEIGHT if len(node) <= NODE_IS_LONG_AFTER_LEN else NODE_LONG_HEIGHT | |
widths.append(dy) | |
print(NODE_FMT.format(x1=x1, y1=y1, x2=x2, y2=y2, txt=node)) | |
y2 = y1 | |
y1 -= dy | |
BRACE_FMT = r' \draw [decorate,decoration={{brace,amplitude=10pt,{additional}}},xshift={minus_mirror}4pt,yshift=0pt] ({x1},{y1}) -- ({x2},{y2}) node [black,midway,xshift={xshift}cm] {{{msg}}};' | |
xshift = -2.75 | |
mirror = True | |
x = NODE_START_X | |
for node_from_idx, node_to_idx, msg in braces: | |
y1 = NODE_START_Y - sum(widths[:node_from_idx-1]) | |
y2 = y1 - sum(widths[node_from_idx:node_to_idx+1]) | |
print(BRACE_FMT.format( | |
x1=x, | |
x2=x, | |
y1=y1, | |
y2=y2, | |
msg=msg, | |
xshift=xshift, | |
additional='mirror' if mirror else '', | |
minus_mirror='-' if mirror else '' | |
)) | |
# every brace change left <-> right | |
xshift = -xshift | |
mirror = not mirror | |
if x == NODE_START_X: | |
x = NODE_START_X + NODE_WIDTH | |
else: | |
x = NODE_START_X | |
banner_x = NODE_START_X + NODE_WIDTH/2.0 | |
print( | |
r' \node at ({x}, {y}) {{Niższe adresy: 0x00...00}};'.format(x=banner_x, y=NODE_START_Y*2.3) | |
) | |
print( | |
r' \node at ({x}, {y}) {{Wyższe adresy: 0xFF...FF}};'.format(x=banner_x, y=NODE_START_Y-sum(widths[:-1])-0.3) | |
) | |
print(r' \end{tikzpicture}') | |
print(r'\end{figure}') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment