Skip to content

Instantly share code, notes, and snippets.

@disconnect3d
Created July 22, 2017 22:13
Show Gist options
  • Save disconnect3d/586d6b1565790fab50a7cf8c6599cd72 to your computer and use it in GitHub Desktop.
Save disconnect3d/586d6b1565790fab50a7cf8c6599cd72 to your computer and use it in GitHub Desktop.
#!/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