diff --git a/documentation/source/_ignore/draw_boot.ipynb b/documentation/source/_ignore/draw_boot.ipynb index 4fc7c83..6641930 100644 --- a/documentation/source/_ignore/draw_boot.ipynb +++ b/documentation/source/_ignore/draw_boot.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 50, + "execution_count": 180, "metadata": {}, "outputs": [], "source": [ @@ -20,41 +20,7 @@ }, { "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "data = pd.read_csv('stack_and_functions.csv')\n", - "\n", - "def convert_to_int(value):\n", - " try:\n", - " if isinstance(value, str) and value.startswith('0x'):\n", - " return int(value, 16)\n", - " else:\n", - " return int(value)\n", - " except ValueError:\n", - " return value \n", - "\n", - "data.sort_values(by=['start'], inplace=True)\n", - "data['start'] = data['start'].apply(convert_to_int)\n", - "data['end'] = data['end'].apply(convert_to_int)\n", - "\n", - "# Check for overlapping ranges, annotatie row with overlap\n", - "data['overlap'] = False\n", - "for i, row in data.iterrows():\n", - " for j, row2 in data.iterrows():\n", - " if i == j:\n", - " continue\n", - " if row['start'] < row2['end'] and row['end'] > row2['start']:\n", - " data.at[i, 'overlap'] = True\n", - " data.at[j, 'overlap'] = True\n", - " data.at[i, 'overlap_with'] = j" - ] - }, - { - "cell_type": "code", - "execution_count": 52, + "execution_count": 197, "metadata": {}, "outputs": [ { @@ -85,6 +51,7 @@ " comment\n", " overlap\n", " overlap_with\n", + " size\n", " \n", " \n", " \n", @@ -96,7 +63,8 @@ " NaN\n", " NaN\n", " True\n", - " 4.0\n", + " 0.0\n", + " 131072\n", " \n", " \n", " 1\n", @@ -107,6 +75,7 @@ " NaN\n", " True\n", " 0.0\n", + " 20480\n", " \n", " \n", " 2\n", @@ -117,6 +86,7 @@ " NaN\n", " True\n", " 0.0\n", + " 20480\n", " \n", " \n", " 3\n", @@ -127,6 +97,7 @@ " NaN\n", " True\n", " 0.0\n", + " 20480\n", " \n", " \n", " 4\n", @@ -137,6 +108,7 @@ " NaN\n", " True\n", " 0.0\n", + " 20480\n", " \n", " \n", " 5\n", @@ -146,7 +118,8 @@ " NaN\n", " NaN\n", " False\n", - " NaN\n", + " 5.0\n", + " 20480\n", " \n", " \n", " 6\n", @@ -156,7 +129,8 @@ " NaN\n", " NaN\n", " False\n", - " NaN\n", + " 6.0\n", + " 8\n", " \n", " \n", " 7\n", @@ -165,92 +139,158 @@ " Event buffer pointer\n", " NaN\n", " NaN\n", - " True\n", - " 8.0\n", + " False\n", + " 7.0\n", + " 20480\n", " \n", " \n", " 8\n", - " 33691648\n", - " 33712128\n", - " BL1 pointer\n", - " NaN\n", - " NaN\n", - " True\n", - " 7.0\n", - " \n", - " \n", - " 9\n", " 33984512\n", " 34004992\n", " First debugger location\n", " NaN\n", " NaN\n", " True\n", - " 10.0\n", + " 9.0\n", + " 20480\n", " \n", " \n", - " 10\n", + " 9\n", " 33992704\n", " 34013184\n", " End of memory stack\n", " NaN\n", " NaN\n", " True\n", - " 9.0\n", + " 8.0\n", + " 20480\n", " \n", " \n", "\n", "" ], "text/plain": [ - " start end name order comment \\\n", - "0 0 131072 BootROM NaN NaN \n", - "1 704 21184 BL1 boot entry point ENTRY NaN \n", - "2 25824 46304 Boot USB function NaN NaN \n", - "3 75848 96328 bootrom authentication function NaN NaN \n", - "4 103184 123664 BL1 boot function NaN NaN \n", - "5 2146304 2166784 Frederic Destination pointer NaN NaN \n", - "6 33689440 33689448 Boot USB return address NaN NaN \n", - "7 33691000 33711480 Event buffer pointer NaN NaN \n", - "8 33691648 33712128 BL1 pointer NaN NaN \n", - "9 33984512 34004992 First debugger location NaN NaN \n", - "10 33992704 34013184 End of memory stack NaN NaN \n", + " start end name order comment \\\n", + "0 0 131072 BootROM NaN NaN \n", + "1 704 21184 BL1 boot entry point ENTRY NaN \n", + "2 25824 46304 Boot USB function NaN NaN \n", + "3 75848 96328 bootrom authentication function NaN NaN \n", + "4 103184 123664 BL1 boot function NaN NaN \n", + "5 2146304 2166784 Frederic Destination pointer NaN NaN \n", + "6 33689440 33689448 Boot USB return address NaN NaN \n", + "7 33691000 33711480 Event buffer pointer NaN NaN \n", + "8 33984512 34004992 First debugger location NaN NaN \n", + "9 33992704 34013184 End of memory stack NaN NaN \n", "\n", - " overlap overlap_with \n", - "0 True 4.0 \n", - "1 True 0.0 \n", - "2 True 0.0 \n", - "3 True 0.0 \n", - "4 True 0.0 \n", - "5 False NaN \n", - "6 False NaN \n", - "7 True 8.0 \n", - "8 True 7.0 \n", - "9 True 10.0 \n", - "10 True 9.0 " + " overlap overlap_with size \n", + "0 True 0.0 131072 \n", + "1 True 0.0 20480 \n", + "2 True 0.0 20480 \n", + "3 True 0.0 20480 \n", + "4 True 0.0 20480 \n", + "5 False 5.0 20480 \n", + "6 False 6.0 8 \n", + "7 False 7.0 20480 \n", + "8 True 9.0 20480 \n", + "9 True 8.0 20480 " ] }, - "execution_count": 52, + "execution_count": 197, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "import pandas as pd\n", + "data = pd.read_csv('stack_and_functions.csv')\n", + "\n", + "def convert_to_int(value):\n", + " try:\n", + " if isinstance(value, str) and value.startswith('0x'):\n", + " return int(value, 16)\n", + " else:\n", + " return int(value)\n", + " except ValueError:\n", + " return value \n", + "\n", + "data.sort_values(by=['start'], inplace=True)\n", + "data['start'] = data['start'].apply(convert_to_int)\n", + "data['end'] = data['end'].apply(convert_to_int)\n", + "data['overlap'] = False\n", + "\n", + "for i, row in data.iterrows():\n", + " for j, row2 in data.iterrows():\n", + " if i == j:\n", + " continue\n", + " if row['start'] < row2['end'] and row['end'] > row2['start']:\n", + " if row['end'] - row['start'] > row2['end'] - row2['start']:\n", + " continue\n", + " data.at[i, 'overlap'] = True\n", + " data.at[j, 'overlap'] = True\n", + " data.at[i, 'overlap_with'] = j\n", + "\n", + "data['overlap_with'] = data['overlap_with'].fillna(data.index.to_series())\n", + "data['overlap_with'] = data['overlap_with'].astype(float)\n", + "data['size'] = data['end'] - data['start']\n", + "\n", "data" ] }, + { + "cell_type": "code", + "execution_count": 239, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "np.int64(34013184)" + ] + }, + "execution_count": 239, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data['end'].iloc[-1]" + ] + }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Create stacked block diagram" + "Inherent stacked block diagram" ] }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 242, "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8.0\n", + "1.25\n", + "1.25\n", + "1.25\n", + "1.25\n", + "inf\n", + "inf\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_16763/1983735317.py:29: RuntimeWarning:\n", + "\n", + "divide by zero encountered in scalar divide\n", + "\n" + ] + }, { "data": { "application/vnd.plotly.v1+json": { @@ -260,7 +300,7 @@ "data": [ { "marker": { - "color": "#2b5c62" + "color": "#ce2c3c" }, "mode": "text", "name": "BootROM", @@ -268,15 +308,15 @@ "textposition": "middle center", "type": "scatter", "x": [ - 1.5 + 2 ], "y": [ - 2.2856563094483198 + 0.5 ] }, { "marker": { - "color": "#c3bb78" + "color": "#ee6511" }, "mode": "text", "name": "BL1 boot entry point", @@ -284,15 +324,15 @@ "textposition": "middle center", "type": "scatter", "x": [ - 0.5 + 2 ], "y": [ - 4.928446417247939 + 1.52 ] }, { "marker": { - "color": "#086666" + "color": "#157424" }, "mode": "text", "name": "Boot USB function", @@ -300,15 +340,15 @@ "textposition": "middle center", "type": "scatter", "x": [ - 1.5 + 2 ], "y": [ - 5.64271401395054 + 2.52 ] }, { "marker": { - "color": "#9744a8" + "color": "#879ab3" }, "mode": "text", "name": "bootrom authentication function", @@ -316,15 +356,15 @@ "textposition": "middle center", "type": "scatter", "x": [ - 1.5 + 2 ], "y": [ - 6.356981610653138 + 3.52 ] }, { "marker": { - "color": "#331fdf" + "color": "#a4cd2c" }, "mode": "text", "name": "BL1 boot function", @@ -332,15 +372,15 @@ "textposition": "middle center", "type": "scatter", "x": [ - 1.5 + 2 ], "y": [ - 7.07124920735574 + 4.52 ] }, { "marker": { - "color": "#972c60" + "color": "#1b44e8" }, "mode": "text", "name": "Frederic Destination pointer", @@ -348,15 +388,15 @@ "textposition": "middle center", "type": "scatter", "x": [ - 1.5 + 2 ], "y": [ - 7.7855168040583385 + 5.5 ] }, { "marker": { - "color": "#2c2ca0" + "color": "#8be123" }, "mode": "text", "name": "Boot USB return address", @@ -364,15 +404,15 @@ "textposition": "middle center", "type": "scatter", "x": [ - 1.5 + 2 ], "y": [ - 8.14279010779962 + 6.5 ] }, { "marker": { - "color": "#d1058f" + "color": "#d82002" }, "mode": "text", "name": "Event buffer pointer", @@ -380,31 +420,15 @@ "textposition": "middle center", "type": "scatter", "x": [ - 1.5 + 2 ], "y": [ - 8.500063411540902 + 7.5 ] }, { "marker": { - "color": "#7d4052" - }, - "mode": "text", - "name": "BL1 pointer", - "text": "BL1 pointer", - "textposition": "middle center", - "type": "scatter", - "x": [ - 1.5 - ], - "y": [ - 9.2143310082435 - ] - }, - { - "marker": { - "color": "#e8bcfa" + "color": "#b60e34" }, "mode": "text", "name": "First debugger location", @@ -412,15 +436,15 @@ "textposition": "middle center", "type": "scatter", "x": [ - 1.5 + 2 ], "y": [ - 9.928598604946101 + 8.52 ] }, { "marker": { - "color": "#81a246" + "color": "#4c0da0" }, "mode": "text", "name": "End of memory stack", @@ -428,10 +452,10 @@ "textposition": "middle center", "type": "scatter", "x": [ - 1.5 + 2 ], "y": [ - 10.6428662016487 + 9.52 ] } ], @@ -454,7 +478,20 @@ }, "shapes": [ { - "fillcolor": "#2b5c62", + "fillcolor": "#ce2c3c", + "layer": "below", + "line": { + "width": 2 + }, + "opacity": 0.5, + "type": "rect", + "x0": 0.9, + "x1": 3.1, + "y0": 0.05, + "y1": 4.95 + }, + { + "fillcolor": "#ee6511", "layer": "below", "line": { "width": 2 @@ -462,25 +499,12 @@ "opacity": 0.5, "type": "rect", "x0": 1, - "x1": 2, - "y0": 0, - "y1": 4.5713126188966395 + "x1": 3, + "y0": 1.07, + "y1": 1.92 }, { - "fillcolor": "#c3bb78", - "layer": "below", - "line": { - "width": 2 - }, - "opacity": 0.5, - "type": "rect", - "x0": 0, - "x1": 1, - "y0": 4.5713126188966395, - "y1": 5.285580215599239 - }, - { - "fillcolor": "#086666", + "fillcolor": "#157424", "layer": "below", "line": { "width": 2 @@ -488,12 +512,12 @@ "opacity": 0.5, "type": "rect", "x0": 1, - "x1": 2, - "y0": 5.285580215599239, - "y1": 5.999847812301839 + "x1": 3, + "y0": 2.07, + "y1": 2.92 }, { - "fillcolor": "#9744a8", + "fillcolor": "#879ab3", "layer": "below", "line": { "width": 2 @@ -501,12 +525,12 @@ "opacity": 0.5, "type": "rect", "x0": 1, - "x1": 2, - "y0": 5.999847812301839, - "y1": 6.714115409004439 + "x1": 3, + "y0": 3.07, + "y1": 3.92 }, { - "fillcolor": "#331fdf", + "fillcolor": "#a4cd2c", "layer": "below", "line": { "width": 2 @@ -514,12 +538,12 @@ "opacity": 0.5, "type": "rect", "x0": 1, - "x1": 2, - "y0": 6.714115409004439, - "y1": 7.428383005707039 + "x1": 3, + "y0": 4.069999999999999, + "y1": 4.92 }, { - "fillcolor": "#972c60", + "fillcolor": "#1b44e8", "layer": "below", "line": { "width": 2 @@ -527,12 +551,12 @@ "opacity": 0.5, "type": "rect", "x0": 1, - "x1": 2, - "y0": 7.428383005707039, - "y1": 8.142650602409638 + "x1": 3, + "y0": 5.05, + "y1": 5.95 }, { - "fillcolor": "#2c2ca0", + "fillcolor": "#8be123", "layer": "below", "line": { "width": 2 @@ -540,12 +564,12 @@ "opacity": 0.5, "type": "rect", "x0": 1, - "x1": 2, - "y0": 8.142650602409638, - "y1": 8.142929613189601 + "x1": 3, + "y0": 6.05, + "y1": 6.95 }, { - "fillcolor": "#d1058f", + "fillcolor": "#d82002", "layer": "below", "line": { "width": 2 @@ -553,12 +577,12 @@ "opacity": 0.5, "type": "rect", "x0": 1, - "x1": 2, - "y0": 8.142929613189601, - "y1": 8.8571972098922 + "x1": 3, + "y0": 7.05, + "y1": 7.95 }, { - "fillcolor": "#7d4052", + "fillcolor": "#b60e34", "layer": "below", "line": { "width": 2 @@ -566,12 +590,12 @@ "opacity": 0.5, "type": "rect", "x0": 1, - "x1": 2, - "y0": 8.8571972098922, - "y1": 9.5714648065948 + "x1": 3, + "y0": 8.07, + "y1": 8.92 }, { - "fillcolor": "#e8bcfa", + "fillcolor": "#4c0da0", "layer": "below", "line": { "width": 2 @@ -579,22 +603,9 @@ "opacity": 0.5, "type": "rect", "x0": 1, - "x1": 2, - "y0": 9.5714648065948, - "y1": 10.2857324032974 - }, - { - "fillcolor": "#81a246", - "layer": "below", - "line": { - "width": 2 - }, - "opacity": 0.5, - "type": "rect", - "x0": 1, - "x1": 2, - "y0": 10.2857324032974, - "y1": 11 + "x1": 3, + "y0": 9.07, + "y1": 9.92 } ], "template": { @@ -1413,18 +1424,20 @@ } } }, - "width": 1600, + "width": 1200, "xaxis": { "range": [ 0, - 3 + 4 ], + "showgrid": false, "showticklabels": false, "tickvals": [ 0, 1, 2, - 3 + 3, + 4 ] }, "yaxis": { @@ -1432,8 +1445,9 @@ "griddash": "longdashdot", "gridwidth": 0, "showgrid": false, + "showticklabels": true, "ticktext": [ - "0x0", + "0x20000
0x0", "0x52c0
0x2c0", "0xb4e0
0x64e0", "0x17848
0x12848", @@ -1441,46 +1455,20 @@ "0x211000
0x20c000", "0x2020f68
0x2020f60", "0x2026578
0x2021578", - "0x2026800
0x2021800", "0x206e000
0x2069000", - "0x2070000
0x206b000", - [ - "0x0", - "0x20000", - "0x2c0", - "0x52c0", - "0x64e0", - "0xb4e0", - "0x12848", - "0x17848", - "0x19310", - "0x1e310", - "0x20c000", - "0x211000", - "0x2020f60", - "0x2020f68", - "0x2021578", - "0x2026578", - "0x2021800", - "0x2026800", - "0x2069000", - "0x206e000", - "0x206b000", - "0x2070000" - ] + "0x2070000
0x206b000" ], "tickvals": [ 0, - 4.5713126188966395, - 5.285580215599239, - 5.999847812301839, - 6.714115409004439, - 7.428383005707039, - 8.142650602409638, - 8.142929613189601, - 8.8571972098922, - 9.5714648065948, - 10.2857324032974 + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 ] } } @@ -1494,105 +1482,101 @@ "import plotly.graph_objects as go\n", "import random\n", "\n", - "data = data.to_dict(orient='records')\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", + "vertical_len = len(data['overlap_with'].unique())\n", + "vertical_gap_percentage = 0.05\n", + "horizontal_gap = 0.1\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", + "for i, d in data.iterrows():\n", + " fillcolor = random_color()\n", + " data.at[i, 'fillcolor'] = fillcolor\n", + " \n", + " x0=1\n", + " x1=3\n", + "\n", + " if d['overlap'] == False:\n", + " y0=d['overlap_with']\n", + " y1=d['overlap_with']+1\n", + " elif d['overlap'] == True:\n", + " overlaps = data.loc[data['overlap_with'] == d['overlap_with']].shape[0]\n", + "\n", + " # Calculate relative size of the overlap\n", + " overlap_sizes = data.loc[data['overlap_with'] == d['overlap_with']].iloc[1:]['size'].sum()\n", + " print((d['size']/overlap_sizes)*overlaps)\n", + "\n", + " if d['overlap'] == i+1:\n", + " y0=i\n", + " y1=overlaps+i\n", + " if y1 == vertical_len:\n", + " y1 = vertical_len + vertical_gap_percentage\n", + " x0=x0-horizontal_gap\n", + " x1=x1+horizontal_gap\n", + " else:\n", + " y0=0.02+i\n", + " y1=0.97+i\n", " else:\n", - " x0 = 1\n", + " print(f'Something went wrong with {d}. Skipping')\n", + " continue\n", "\n", " fig.add_shape(\n", " type=\"rect\",\n", " x0=x0,\n", - " y0=prev_y * len(data),\n", - " x1=x0 + 1,\n", - " y1=max_y * len(data),\n", + " x1=x1,\n", + " y0=y0+gap_percentage,\n", + " y1=y1-gap_percentage,\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=[x0+0.5],\n", - " y=tickpoint,\n", + " x=[(x0+x1)/2],\n", + " y=[y0+0.5],\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, 3],\n", - " tickvals=[0, 1, 2, 3],\n", + " range=[0, 4],\n", + " tickvals=[0, 1, 2, 3, 4],\n", ")\n", "\n", - "labels = [hex(value) for d in data for value in (d.get('start'), d['end']) if 'end' in d]\n", + "labels = []\n", + "for i, j in zip(data['start'], data['end']):\n", + " labels.append(f'{hex(j)}
{hex(i)}')\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", + "tickpointers = [i for i in range(len(data))]\n", "\n", "fig.update_yaxes(\n", " # tickvals=[i for i in range(len(data)+1)], \n", " tickvals = tickpointers,\n", - " ticktext=labelset,\n", + " ticktext= labels,\n", " griddash=\"longdashdot\",\n", " gridwidth=0,\n", " gridcolor=\"black\",\n", " showgrid=False,\n", + " showticklabels=True,\n", ")\n", "\n", "fig.update_xaxes(\n", - " # Disable ticks\n", + " showgrid=False,\n", " showticklabels=False,\n", ")\n", "\n", "fig.update_layout(\n", - " width=1600,\n", + " width=1200,\n", " height=1200,\n", " autosize=True,\n", " margin=dict(l=200, r=20, t=20, b=20),\n", diff --git a/documentation/source/_ignore/stack_and_functions.csv b/documentation/source/_ignore/stack_and_functions.csv index 3cb89d1..475e541 100644 --- a/documentation/source/_ignore/stack_and_functions.csv +++ b/documentation/source/_ignore/stack_and_functions.csv @@ -7,6 +7,5 @@ start,end,name,order,comment 2146304,2166784,Frederic Destination pointer,, 33689440,33689448,Boot USB return address,, 33691000,33711480,Event buffer pointer,, -33691648,33712128,BL1 pointer,, 33984512,34004992,First debugger location,, 33992704,34013184,End of memory stack,,