{ "cells": [ { "cell_type": "code", "execution_count": 263, "metadata": {}, "outputs": [], "source": [ "# Using plotly\n", "import plotly.graph_objects as go\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Define data" ] }, { "cell_type": "code", "execution_count": 264, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "data = pd.read_csv('stack_and_functions.csv').to_dict(orient='records')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create block diagram" ] }, { "cell_type": "code", "execution_count": 266, "metadata": {}, "outputs": [ { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "marker": { "color": "#768f95" }, "mode": "text", "name": "BootROM", "text": "BootROM", "textposition": "middle center", "type": "scatter", "x": [ 0.5 ], "y": [ 2.1463414634146343 ] }, { "marker": { "color": "#2564cb" }, "mode": "text", "name": "BL1 boot entry point", "text": "BL1 boot entry point", "textposition": "middle center", "type": "scatter", "x": [ 0.5 ], "y": [ 4.628048780487806 ] }, { "marker": { "color": "#9e0519" }, "mode": "text", "name": "Boot USB function", "text": "Boot USB function", "textposition": "middle center", "type": "scatter", "x": [ 0.5 ], "y": [ 5.298780487804878 ] }, { "marker": { "color": "#2f0c12" }, "mode": "text", "name": "bootrom authentication function", "text": "bootrom authentication function", "textposition": "middle center", "type": "scatter", "x": [ 0.5 ], "y": [ 5.969512195121951 ] }, { "marker": { "color": "#7e4e8a" }, "mode": "text", "name": "BL1 boot function", "text": "BL1 boot function", "textposition": "middle center", "type": "scatter", "x": [ 0.5 ], "y": [ 6.640243902439026 ] }, { "marker": { "color": "#43f7e5" }, "mode": "text", "name": "Frederic Destination pointer", "text": "Frederic Destination pointer", "textposition": "middle center", "type": "scatter", "x": [ 0.5 ], "y": [ 7.310975609756099 ] }, { "marker": { "color": "#d4b036" }, "mode": "text", "name": "Boot USB return address", "text": "Boot USB return address", "textposition": "middle center", "type": "scatter", "x": [ 0.5 ], "y": [ 7.981707317073173 ] }, { "marker": { "color": "#574d7b" }, "mode": "text", "name": "Event buffer pointer", "text": "Event buffer pointer", "textposition": "middle center", "type": "scatter", "x": [ 0.5 ], "y": [ 8.652439024390247 ] }, { "marker": { "color": "#34619d" }, "mode": "text", "name": "BL1 pointer", "text": "BL1 pointer", "textposition": "middle center", "type": "scatter", "x": [ 0.5 ], "y": [ 9.32317073170732 ] }, { "marker": { "color": "#57f720" }, "mode": "text", "name": "First debugger location", "text": "First debugger location", "textposition": "middle center", "type": "scatter", "x": [ 0.5 ], "y": [ 9.993902439024394 ] }, { "marker": { "color": "#dca8fd" }, "mode": "text", "name": "End of memory stack", "text": "End of memory stack", "textposition": "middle center", "type": "scatter", "x": [ 0.5 ], "y": [ 10.664634146341468 ] } ], "layout": { "autosize": true, "font": { "size": 18 }, "height": 1200, "legend": { "title": { "text": "Function/Locations" } }, "margin": { "b": 20, "l": 200, "r": 20, "t": 20 }, "shapes": [ { "fillcolor": "#768f95", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 0.1, "x1": 1, "y0": 0, "y1": 4.2926829268292686 }, { "fillcolor": "#2564cb", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 0, "x1": 1, "y0": 4.2926829268292686, "y1": 4.963414634146342 }, { "fillcolor": "#9e0519", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 0.1, "x1": 1, "y0": 4.963414634146342, "y1": 5.634146341463415 }, { "fillcolor": "#2f0c12", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 0.1, "x1": 1, "y0": 5.634146341463415, "y1": 6.3048780487804885 }, { "fillcolor": "#7e4e8a", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 0.1, "x1": 1, "y0": 6.3048780487804885, "y1": 6.975609756097562 }, { "fillcolor": "#43f7e5", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 0.1, "x1": 1, "y0": 6.975609756097562, "y1": 7.646341463414636 }, { "fillcolor": "#d4b036", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 0.1, "x1": 1, "y0": 7.646341463414636, "y1": 8.31707317073171 }, { "fillcolor": "#574d7b", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 0.1, "x1": 1, "y0": 8.31707317073171, "y1": 8.987804878048784 }, { "fillcolor": "#34619d", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 0.1, "x1": 1, "y0": 8.987804878048784, "y1": 9.658536585365857 }, { "fillcolor": "#57f720", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 0.1, "x1": 1, "y0": 9.658536585365857, "y1": 10.329268292682931 }, { "fillcolor": "#dca8fd", "layer": "below", "line": { "width": 2 }, "opacity": 0.5, "type": "rect", "x0": 0.1, "x1": 1, "y0": 10.329268292682931, "y1": 11.000000000000005 } ], "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "fillpattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "width": 1000, "xaxis": { "range": [ 0, 1 ], "showticklabels": false, "tickvals": [ 0, 1 ] }, "yaxis": { "gridcolor": "black", "griddash": "longdashdot", "gridwidth": 0, "showgrid": false, "ticktext": [ "0x0", "0x52c0
0x2c0", "0xb4e0
0x64e0", "0x17848
0x12848", "0x1e310
0x19310", "0x211000
0x20c000", "0x2025f60
0x2020f60", "0x2026578
0x2021578", "0x2026800
0x2021800", "0x206e000
0x2069000", "0x2070000
0x206b000", [ "0x0", "0x20000", "0x2c0", "0x52c0", "0x64e0", "0xb4e0", "0x12848", "0x17848", "0x19310", "0x1e310", "0x20c000", "0x211000", "0x2020f60", "0x2025f60", "0x2021578", "0x2026578", "0x2021800", "0x2026800", "0x2069000", "0x206e000", "0x206b000", "0x2070000" ] ], "tickvals": [ 0, 4.2926829268292686, 4.963414634146342, 5.634146341463415, 6.3048780487804885, 6.975609756097562, 7.646341463414636, 8.31707317073171, 8.987804878048784, 9.658536585365857, 10.329268292682931 ] } } } }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import plotly.graph_objects as go\n", "import random\n", "\n", "# If there is no end, set it to start + 0x1000\n", "for d in data:\n", " if 'end' not in d:\n", " d['end'] = d['start'] + 0x5000\n", "\n", "# If there is no start, set it to end - 0x1000\n", "for d in data:\n", " if 'start' not in d:\n", " d['start'] = d['end'] - 0x5000\n", "\n", "# Sort the data by start\n", "data = sorted(data, key=lambda x: x['start'])\n", "total_used_len = sum([d['end']-d['start'] for d in data]) # Length of all blocks described\n", "tickpointers = []\n", "\n", "def random_color():\n", " return f'#{random.randint(0, 0xFFFFFF):06x}'\n", "\n", "# Create a square for each index\n", "fig = go.Figure()\n", "for i, d in enumerate(data):\n", " if i == 0:\n", " prev_y = 0\n", " max_y = (prev_y + ((d['end'] - d['start']) / total_used_len))\n", " fillcolor = random_color()\n", "\n", " if d['Order'] == \"ENTRY\":\n", " x0 = 0\n", " else:\n", " x0 = 0.1\n", "\n", " fig.add_shape(\n", " type=\"rect\",\n", " x0=x0,\n", " y0=prev_y * len(data),\n", " x1=0 + 1,\n", " y1=max_y * len(data),\n", " line=dict(width=2),\n", " fillcolor=fillcolor,\n", " opacity=0.5,\n", " layer=\"below\",\n", " )\n", "\n", " tickpoint = [(prev_y + (max_y - prev_y) / 2) * len(data)]\n", " tickpointers.extend([prev_y * len(data)])\n", "\n", " fig.add_trace(go.Scatter\n", " (\n", " x=[0.5],\n", " y=tickpoint,\n", " text=d['name'],\n", " mode=\"text\",\n", " textposition=\"middle center\",\n", " name=d['name'],\n", " # Set color to\n", " marker=dict(\n", " color=fillcolor,\n", " ),\n", " ))\n", " \n", " prev_y = max_y\n", "\n", "fig.update_xaxes(\n", " range=[0, 1],\n", " tickvals=[0, 1],\n", ")\n", "\n", "labels = [hex(value) for d in data for value in (d.get('start'), d['end']) if 'end' in d]\n", "\n", "# If label is not the first in labels or the last entry, merge the label with the next label\n", "labelset = []\n", "for i in range(0, len(labels), 2):\n", " if i == 0:\n", " labelset.append(labels[i])\n", " elif i == len(labels) - 1:\n", " labelset.append(labels[i])\n", " else:\n", " labelset.append(f\"{labels[i+1]}
{labels[i]}\")\n", "labelset.append(labels)\n", "\n", "fig.update_yaxes(\n", " # tickvals=[i for i in range(len(data)+1)], \n", " tickvals = tickpointers,\n", " ticktext=labelset,\n", " griddash=\"longdashdot\",\n", " gridwidth=0,\n", " gridcolor=\"black\",\n", " showgrid=False,\n", ")\n", "\n", "fig.update_xaxes(\n", " # Disable ticks\n", " showticklabels=False,\n", ")\n", "\n", "fig.update_layout(\n", " width=1000,\n", " height=1200,\n", " autosize=True,\n", " margin=dict(l=200, r=20, t=20, b=20),\n", " font=dict(\n", " size=18,\n", " ),\n", " # Legend being the name of the function\n", " legend_title_text=\"Function/Locations\",\n", ")\n", "\n", "fig.show()" ] } ], "metadata": { "kernelspec": { "display_name": "venv", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.12" } }, "nbformat": 4, "nbformat_minor": 2 }