diff --git a/notebooks/advanced/Folding-Tutorial.ipynb b/notebooks/advanced/3_folding.ipynb similarity index 63% rename from notebooks/advanced/Folding-Tutorial.ipynb rename to notebooks/advanced/3_folding.ipynb index 409595d0d8..b1baf69cab 100644 --- a/notebooks/advanced/Folding-Tutorial.ipynb +++ b/notebooks/advanced/3_folding.ipynb @@ -26,14 +26,20 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Note: The build_flow in the cybsec_mlp notebook comprises a transformation step `step_target_fps_parallelization` that automatically sets custom parallelization parameters needed to achieve a given `target_fps` by invoking the `SetFolding` transformation.\n", - "\n", - "More details of the above step can be found here: https://github.com/Xilinx/finn/blob/main/src/finn/builder/build_dataflow_steps.py#L394\n", + "Note: The build_flow in the cybsec_mlp notebook comprises a transformation step `step_target_fps_parallelization` that automatically sets custom parallelization parameters needed to achieve a given `target_fps` by invoking the [`SetFolding` transformation](https://github.com/Xilinx/finn/blob/main/src/finn/transformation/fpgadataflow/set_folding.py#L46).\n", "\n", + "More details of the above step can be found [here](https://github.com/Xilinx/finn/blob/main/src/finn/builder/build_dataflow_steps.py#L394)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "This notebook shows the manual version of this step and explains how these attributes can improve performance and what are their effects on resource utilization for developers who need to maximize the performance of their network. \n", "\n", - "* input : the 'step_convert_to_hls.onnx' file (we pick has gone through a series of transformation passes) to be analyzed in terms of clock cycles and resource utilization per layer\n", - "* analyze the estimated execution clock cycles and the resource utilization of each layer in the network" + "For that we will use the `step_convert_to_hls.onnx` file as starting point. This intermediate model from the cybersecurity example is the model representation after the high-level ONNX layers are converted to HLS layers. Each node in the graph now corresponds to an HLS C++ function call and the parallelization parameters can be set using the node attributes.\n", + "\n", + "We will take this model to show how to set the folding factors manually and analyze the estimated execution clock cycles and the resource utilization of each layer in the network." ] }, { @@ -42,11 +48,15 @@ "source": [ "### FINN-style Dataflow Architectures \n", "\n", - "We start with a quick recap of FINN-style dataflow architectures. The key idea in such architectures is to parallelize across layers as well as within layers by dedicating a proportionate amount of compute resources to each layer, as illustrated in the figure below taken from the [FINN-R paper](https://arxiv.org/pdf/1809.04570.pdf):\n", + "We start with a quick recap of FINN-style dataflow architectures. The key idea in such architectures is to parallelize across layers as well as within layers by dedicating a proportionate amount of compute resources to each layer, as illustrated in the figure below.\n", + "\n", + "![](finn-dataflow.png)\n", "\n", - "![](finn-hw-arch.png)\n", + "In practice, the layers are instantiated by function calls to optimized Vitis HLS building blocks from the [finn-hlslib](https://github.com/Xilinx/finn-hlslib) library.\n", "\n", - "In practice, the compute arrays are instantiated by function calls to optimized Vitis HLS building blocks from the [finn-hlslib](https://github.com/Xilinx/finn-hlslib) library. As these function calls can only handle certain patterns/cases, we need to transform the network into an appropriate form so that we can replace network layers with these function calls, which is the goal of the network preparation process." + "Since each layer will be instantiated, we can flexibly set the parallelization of each layer and thus control resources and throughput of our network, as visualized in the imaged below:\n", + "\n", + "![](finn-folding.png)" ] }, { @@ -55,15 +65,14 @@ "source": [ "# Part-1 : Loading the ONNX model.\n", "\n", - "The 'onnx' file needs to go through multiple transformations before it can be fed into our estimation functions.\n", + "As discussed above, the network needs to go through a few preparation steps before it can be fed into our estimation functions.\n", "\n", - "The 'onnx' file loaded here is taken from the cybersecurity end2end example notebook. The build_step in the notebook comprises several series of transformations that take place before the onnx file is used for bitstream generation.\n", - "We pick the onnx file `step_convert_to_hls` to which the necessary transformations have been applied for this notebook (Network layers mapped to necessary FINN-HLS blocks. In this case, the `MatrixVectorActivation` Units). \n", + "The `.onnx` file loaded here is taken from the cybersecurity end2end example notebook. \n", + "We pick the onnx file `step_convert_to_hls.onnx` to which the necessary transformations have been applied for this notebook (Network layers mapped to necessary FINN-HLS blocks. In this case, the `MatrixVectorActivation` Units). \n", "\n", - "More information on these transformations can be found in the tfc_end2end_example notebook.\n", + "To interact with the `.onnx` file we use the `ModelWrapper()`. This wrapper simplifies the access to different model attributes and allows us to apply custom transformations on the model.\n", "\n", - "To interact with the 'onnx' file we use the `ModelWrapper()` helper function. This function gives access to different model attributes and allows us to apply custom tranformations to it.\n", - "In the below cell, we load our onnx file and view the cybersecurity MLP network in netron." + "In the below cell, we load our onnx file and view the cybersecurity MLP network in Netron." ] }, { @@ -75,7 +84,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Serving './step_convert_to_hls_folding.onnx' at http://0.0.0.0:5901\n" + "Serving 'step_convert_to_hls.onnx' at http://0.0.0.0:5920\n" ] }, { @@ -85,7 +94,7 @@ " " + "" ] }, "execution_count": 2, @@ -103,152 +112,63 @@ ], "source": [ "from qonnx.core.modelwrapper import ModelWrapper\n", - "model = ModelWrapper(\"./step_convert_to_hls.onnx\")\n", + "model = ModelWrapper(\"../end2end_example/cybersecurity/output_estimates_only/intermediate_models/step_convert_to_hls.onnx\")\n", + "model.save(\"step_convert_to_hls.onnx\")\n", "\n", - "showInNetron(\"./step_convert_to_hls.onnx\",localhost_url='xirxlabs53')" + "showInNetron(\"step_convert_to_hls.onnx\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# Part 2 : Parallelisation Attributes : PE & SIMD" + "# Part 2 : Parallelization Parameters: PE & SIMD" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "**PE & SIMD represent the amount of time-multiplexity to which we expose each of our network layers. \n", - "These parallelization attributes are subject to certain constraints and should be selected accordingly.**\n", + "The computational parallelism can be varied by setting the folding factors or also called parallelization parameters **PE** and **SIMD** of each layer. These parallelization attributes are subject to certain constraints and should be selected accordingly.\n", "\n", - "We see how they work through an example of a multiplication computation (Matrix-Vector) in the `MatrixVectorActivation` layer looks like.\n", + "To see more details about how this is implemented in the `MatrixVectorActivation` layer (MVAU), please have a look at [this documentation](https://github.com/Xilinx/finn/blob/github-pages/docs/finn-sheduling-and-folding.pptx). A schematic of the folding in an MVAU for a fully-connected layer is shown below:\n", "\n", - "From the below block diagram, we observe that `SIMD` represents the parallelism within a single dot-product computation (the number of multiplications is a single clock cycle), while `PE` refers to how many such (Matrix-Vector?) dot-products execute in parallel.\n", - "\n", - "If `PE` & `SIMD` are set to 2 & 4 for a given layer that means, that within a dot-product 4 multiplications will happen in parallel and 2 such dot-products will execute in parallel.\n", - "\n", - "The base case of `PE` & `SIMD` both set as 1 suggest that there will be no parallelization therefore the resource utilization would be low (resources can be resued for differnt multiplication operations) when compared to settings where network layers have higher `PE` & `SIMD` values." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - "Question in the third line of the above cell.\n", - "
" + "![](finn-folding-mvau.png)" ] }, { - "attachments": { - "MVA-1.png": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABX4AAAMbCAMAAADNe32MAAAACXBIWXMAAB7CAAAewgFu0HU+AAAAV1BMVEX////v7++lpaUgICDd3d0bGxvh4eEAAAAQEBBKSkq7u7syMjLNzc1WVlYNDQ2YmJhnZ2dCQkLx8fG1tbUrKyvU1NSrq6t2dnaIiIg5OTnDw8Po6Oj5+fnQLuJiAAAgAElEQVR4Ae2djXqiOhRFbdVGW387ttXW93/OSYJBxBw4OxFF3dz7jUDOSWAR12Qi4mDAhQRIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARI4J4J/H0vl69vhzP4+xrZtb+vr6/ylPbFxot9scvopSw4W9l/zUI9Z2XcQQIkQAIkcELgbW78spv53T9mZ1+3dlfp31djxnbfsogzZrKKO3b/M7EhH0U9J21wgwRIgARIoE7gb2jMdLWaWnH+urKfRdDvTwhdl/od2mVsIxf/Qlnldb+2Yl5tjKF/K1S4SgIkQAICgZUZ+rHs384M9zYmjH4nZnPIeLG+ndj1pRn6Pfv3oVlEFLv1Ne3nZn1I5AsJkAAJkIBMYGy+i8I3Y97tWhj9rsdh9mFppofJh0K/g8HLOKLY/WH4PDLmT26OJSRAAiRAAgWBgzTtxnztphTC6He6MofZh7V5rel38O5nGPYv5fI5GHwHJX/RvuxcJEACJNBO4MOsrTuPy/bw0dv0d1HMPvyZ9b+6fgdjs618FucnJ37crv2bm8DgQgIkQAIk0Erg236Qtvo+DljL0a9VrL/3YWte30/mfl2VczO3+p2MJ+Pif2vqqXn9sh/SmXn8tojWA2EACZAACTwZgdeFdabZrNzEr12Cftd2zc8+7Mzn+eh3ZaZF+PHPnflZmN3O3iXhbhzmQgIkQAIk0EbgZesGrcbs/GA36Hc6mPk7HUZ2nBvTr7s97WSxd5zt7MD3beNnL06KuEECJEACJBAn8Pn+Y+05ccPWMPdr7x4butmH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nr/vzXHlbxJ+C0PXAxhFAloCVQH7z/vtja92cX8Wa37zsf8oZr/drMXITjxY4XDq93DBX47/OtrYfxxwIQESuCyBl3IEvHjSLxvY2V67+G8eD92a++4FF0fgx+FwC+XLDkEC3RB4+fFfuH3a213/vGH89639QHjdDeb7q/XvMPilfO/v2vGI74fAy7YQ8JMOf/2Y98VdLj8Qzpn6vZ9rrjjSH//3EuWrQMUQEsggUAj4Sb/t5ca8xR0TfiDMD/iLjuQHv5RvxruKqSSgJPDpRsDPOfz9t1uvD190m9sbkzn1W3QZO/ilfJXvHoaRQCaB/Xb8pMPfTHCPmf6yoHwf88ryrPpJ4HNrb37lQgKOwCtvNWNHIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIGuCPwH9j3d4Kg1fY0AAAAASUVORK5CYII=" - } - }, "cell_type": "markdown", "metadata": {}, "source": [ - "![MVA-1.png](attachment:MVA-1.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Based on the above block diagram we find that `PE` & `SIMD` parallelization attributes are subject to the following constraints. \n", - "If `W` is the width of the input and `H` is the height of the output in a Matrix-Vector Computation then:\n", + "In the case of the MVAU, `PE` & `SIMD` are subject to the following constraints: \n", + "\n", + "If `MW` is the number of input features and `MH` the number of output features:\n", "\n", - " W % SIMD == 0\n", - " H % PE == 0\n", + " MW % SIMD == 0\n", + " MH % PE == 0\n", " \n", - "For the above example, H = 12 and W = 12. The demonstrated PE & SIMD values adhere to the above constraints.\n", + "Total folding in the case of the MVAU is defined as:\n", "\n", - "We also define a term referred to as total folding which is defined as :\n", + " Total folding = (MH/PE) x (MW/SIMD)\n", "\n", - " Total folding = (H/PE) x (W/SIMD)\n", + "In a streaming dataflow architecture like it is in FINN designs the throughput is determined by the slowest layer. So, the goal of adjusting these parameters is to get an almost balanced pipeline i.e. equalizing the throughput rate of layers in the generated dataflow architecture.\n", "\n", - "The goal of adjusting these parameters is to get an almost balanced pipeline i.e. equalling the rate of producers and consumers in the generated dataflow architecture.\n", - "This can be achieved (or almost achieved) by keeping the `total folding` parameter approximately constant across all layers.\n", + "The FINN compiler provides analysis passes to facilitate the exploration of the folding factors of each layer. In this notebook we will show how to use these functions and explore how the parallelization parameters affect the clock cycles and the resource utilization of the generated dataflow architecture.\n", "\n", - "We now explore how these parameters affect the estimated clock cycles and the resource utilization of the generated dataflow architectures.\n", - "We start with a naive case where `PE` & `SIMD` values across all layers are 1 and observe the above-mentioned numbers.\n", - "We define the utility functions (`exp_cycles_per_layer()`) and (`res_estimation()`) to estimate the number of clock cycles and resource utilization of each network layer." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - "Should this line be added (The `exp_cycles_per_layer` formula is equal to the total folding in this case as the number of input vectors is 1 and the mmv value is also 1).\n", - "
" + "We start with a naive case where `PE` & `SIMD` values across all layers are 1, this is the starting point of our exploration and is also the state the network is in after the conversion to HLS layers. If you take a look at the model using Netron and click on one of the MVAU layers, you can see that `PE` and `SIMD` are both set to 1 by default." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, - "outputs": [], - "source": [ - "from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer\n", - "from finn.analysis.fpgadataflow.res_estimation import res_estimation" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We now individually extract the `MatrixVectorActivation` blocks from the onnx file and set the config values manually (although this can be done automatically by Vivado tools also as mentioned in the introduction).\n", - "\n", - "In the first step, we set the `PE` & `SIMD` values for all the layers to be '1' to establish a baseline and measure the estimated clock cycles and resource utilization for each of the individual layers.\n", - "\n", - "We utilize from (`getCustomOp()`) as the helper function to set different properties of the node. The (`set_nodeattr()`) function within this function call helps us set these values." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "from qonnx.custom_op.registry import getCustomOp\n", - "fc_layers = model.get_nodes_by_op_type(\"MatrixVectorActivation\")\n", - "# (PE, SIMD, in_fifo_depth, out_fifo_depth, ramstyle) for each layer\n", - "config = [\n", - " (1, 1, [16], [64], \"block\"),\n", - " (1, 1, [64], [64], \"auto\"),#8,8\n", - " (1, 1, [64], [64], \"auto\"),#8,8\n", - " (1, 1, [64], [1], \"distributed\"),\n", - "]\n", - "for fcl, (pe, simd, ififo, ofifo, ramstyle) in zip(fc_layers, config):\n", - " fcl_inst = getCustomOp(fcl)\n", - " fcl_inst.set_nodeattr(\"PE\", pe)\n", - " fcl_inst.set_nodeattr(\"SIMD\", simd)\n", - " fcl_inst.set_nodeattr(\"inFIFODepths\", ififo)\n", - " fcl_inst.set_nodeattr(\"outFIFODepths\", ofifo)\n", - " fcl_inst.set_nodeattr(\"ram_style\", ramstyle)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After setting these parameters, we save the model and view it using `Netron`\n", - ". We can observe the values we set in the above step by clicking on any of the nodes and observing their properties." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Stopping http://0.0.0.0:5901\n", - "Serving './cybsec_PE_SIMD_not_modified.onnx' at http://0.0.0.0:5901\n" + "Stopping http://0.0.0.0:5920\n", + "Serving 'step_convert_to_hls.onnx' at http://0.0.0.0:5920\n" ] }, { @@ -258,7 +178,7 @@ " " + "" ] }, - "execution_count": 10, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "model.save(\"./cybsec_PE_SIMD_not_modified.onnx\")\n", - "showInNetron(\"./cybsec_PE_SIMD_not_modified.onnx\",localhost_url='xirxlabs53')" + "showInNetron(\"step_convert_to_hls.onnx\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "We pass our model to the `exp_cycles_per_layer()` and `res_estimation()` functions which iteratively go through all the layers in the graph and measure the expected execution clock cycles and resource utilization for each of them and return a dictionary with calculated values." + "We import the analysis passes (`exp_cycles_per_layer()`) and (`res_estimation()`) to estimate the number of clock cycles and resource utilization of each network layer." ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ - "cycles_dict = []\n", - "cycles_dict = exp_cycles_per_layer(model)" + "from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer\n", + "from finn.analysis.fpgadataflow.res_estimation import res_estimation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Analysis passes in FINN return information about the model in form of a dictionary, you can learn more about analysis passes in general in this Jupyter notebook: [0_custom_analysis_pass.ipynb](0_custom_analysis_pass.ipynb).\n", + "\n", + "We start by calling the analysis pass `exp_cycles_per_layer()`, which returns a dictionary with the layer names as keys and the expected cycles as values. Afterwards, we plot the result in a block diagram." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'MatrixVectorActivation_0': 38400,\n", + " 'MatrixVectorActivation_1': 4096,\n", + " 'MatrixVectorActivation_2': 4096,\n", + " 'MatrixVectorActivation_3': 64}" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cycles_dict = model.analysis(exp_cycles_per_layer)\n", + "cycles_dict" ] }, { @@ -303,7 +255,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3cAAAHWCAYAAADU7HB0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAA9hAAAPYQGoP6dpAABpGklEQVR4nO3deVhV5d7/8c8GBQcmZxzIsVQUJSckcyhJHNOyQTPFsTS0lHI6ldpo2SnNnBpOUuenOaYNThEqalKZirOmpmkqOAKKCgj37w8f1nELKii6afd+Xde6nrPvda+1vmvtffv0YU02Y4wRAAAAAOBvzcXRBQAAAAAAbh3hDgAAAACcAOEOAAAAAJwA4Q4AAAAAnADhDgAAAACcAOEOAAAAAJwA4Q4AAAAAnADhDgAAAACcAOEOAAAAAJwA4Q6AU2jVqpVatWrl6DLy1cGDB2Wz2RQZGVmg1pWTyMhI2Ww2/fbbb7dl/fnpdh+La9m7d6/atGkjb29v2Ww2LV68+I5u/05o1aqV6tat6+gyCrSs39+///3vm1reZrNp3Lhx+VsUAKdBuANwW2X9R/+1pp9//jnX69q5c6fGjRungwcP3r6Cb8K0adPueFDA309YWJi2bdumt956S//973/VqFEjR5fk9I4ePapx48YpLi7O0aUAwB1RyNEFAPhneP3111W1atVs7TVq1Mj1Onbu3KnXXntNrVq1UpUqVezm/fDDD7da4k2bNm2aSpcurd69ezusBhRsFy5cUGxsrF5++WUNHjzY0eX8Yxw9elSvvfaaqlSposDAQEeXAwC3HeEOwB3Rrl2723qmws3N7batG7hVJ06ckCT5+Pjk2zpTUlJUvHjxfFsfbq/MzEylpaU5uozb6uLFi3Jzc5OLCxeGAY7C6ANQYMyZM0cNGzaUp6envLy8FBAQoA8//FDS5cs7H3/8cUnSAw88YF3WuXr1aknZ77lbvXq1bDab5s2bp9dee00VK1aUp6enHnvsMSUlJSk1NVVDhw5V2bJl5eHhoT59+ig1NdWunpkzZ+rBBx9U2bJl5e7uLn9/f02fPt2uT5UqVbRjxw7FxMRYNV1ZR2JiooYOHSo/Pz+5u7urRo0aevfdd5WZmWm3nsTERPXu3Vve3t7y8fFRWFiYEhMTc33sEhMTNWzYMFWpUkXu7u6qVKmSevXqpZMnT153uZUrV6p58+YqXry4fHx81LlzZ+3atStbvyNHjqhfv36qUKGC3N3dVbVqVQ0aNOi6/7F65swZNWnSRJUqVdKePXtuuv5z586pePHieuGFF7It99dff8nV1VXjx4+/5WOxe/duPfbYYypZsqSKFCmiRo0a6dtvv7Xrk56ertdee0133323ihQpolKlSun+++9XVFTUNdc7btw4Va5cWZI0fPhw2Ww2uzPPmzdvVrt27eTl5SUPDw+1bt062+XKWZc3x8TE6LnnnlPZsmVVqVKl6+5Pamqqxo4dqxo1asjd3V1+fn4aMWLETf3OsyxbtkwtW7a0xmjjxo01e/bsbP127typBx54QMWKFVPFihU1YcKE69aaxWazafDgwVq8eLHq1q0rd3d31alTR8uXL8/W98iRI+rbt6/KlStn9fv888+t+atXr1bjxo0lSX369LHGZ2RkpCZPnixXV1e7Mfb+++/LZrMpIiLCasvIyJCnp6dGjhxptaWkpOjFF1+0xnTNmjX173//W8aYHPdl1qxZqlOnjtzd3XPcD0kyxuiZZ56Rm5ubvv7661wdqyx//vmnnnvuOdWsWVNFixZVqVKl9Pjjj9tdvv7HH3/IZrNp4sSJ2ZZfv369bDabvvrqK6vtRsdW+t+/sXPmzNErr7yiihUrqlixYkpOTs5T/QDyF2fuANwRSUlJ2f7j2mazqVSpUpKkqKgode/eXa1bt9a7774rSdq1a5d++uknvfDCC2rRooWef/55TZ48Wf/6179Uu3ZtSbL+77WMHz9eRYsW1ahRo7Rv3z599NFHKly4sFxcXHTmzBmNGzdOP//8syIjI1W1alWNGTPGWnb69OmqU6eOHn74YRUqVEjfffednnvuOWVmZio8PFySNGnSJA0ZMkQeHh56+eWXJUnlypWTJJ0/f14tW7bUkSNH9Oyzz+quu+7S+vXrNXr0aB07dkyTJk2SdPk/7Dp37qx169Zp4MCBql27thYtWqSwsLBcHdtz586pefPm2rVrl/r27asGDRro5MmT+vbbb/XXX3+pdOnSOS73448/ql27dqpWrZrGjRunCxcu6KOPPlKzZs20adMmK4AcPXpUTZo0UWJiop555hnVqlVLR44c0YIFC3T+/Pkcz5qePHlSDz30kE6fPq2YmBhVr179pusPDAzUI488orlz5+qDDz6Qq6urtexXX30lY4x69OhxS8dix44datasmSpWrKhRo0apePHimjdvnrp06aKFCxfqkUcekXQ5qI0fP179+/dXkyZNlJycrN9++02bNm3SQw89lOO6H330Ufn4+GjYsGHq3r272rdvLw8PD2u7zZs3l5eXl0aMGKHChQvr448/VqtWrRQTE6OgoCC7dT333HMqU6aMxowZo5SUlGse08zMTD388MNat26dnnnmGdWuXVvbtm3TxIkT9fvvv9s9zCU3v3PpcsDs27ev6tSpo9GjR8vHx0ebN2/W8uXL9dRTT1n9zpw5o7Zt2+rRRx/VE088oQULFmjkyJEKCAhQu3btrllzlnXr1unrr7/Wc889J09PT02ePFldu3bVoUOHrH8vEhIS1LRpUytAlSlTRsuWLVO/fv2UnJysoUOHqnbt2nr99dc1ZswYPfPMM2revLkk6b777lNSUpIyMzO1bt06dezYUZK0du1aubi4aO3atVYtmzdv1rlz59SiRQtJl8fqww8/rFWrVqlfv34KDAzUihUrNHz4cB05ciRbeFq5cqXmzZunwYMHq3Tp0tkuJ5cuB8i+fftq7ty5WrRokTp06HDDY3SlDRs2aP369erWrZsqVaqkgwcPavr06WrVqpV27typYsWKqVq1amrWrJlmzZqlYcOG2S0/a9YseXp6qnPnzrk+tld644035ObmppdeekmpqalcRQE4mgGA22jmzJlGUo6Tu7u71e+FF14wXl5e5tKlS9dc1/z5840ks2rVqmzzWrZsaVq2bGl9XrVqlZFk6tata9LS0qz27t27G5vNZtq1a2e3fHBwsKlcubJd2/nz57NtJzQ01FSrVs2urU6dOnbbzvLGG2+Y4sWLm99//92ufdSoUcbV1dUcOnTIGGPM4sWLjSQzYcIEq8+lS5dM8+bNjSQzc+bMbOu+0pgxY4wk8/XXX2ebl5mZaYwx5sCBA9nWFRgYaMqWLWtOnTpltW3ZssW4uLiYXr16WW29evUyLi4uZsOGDddcf9b3vGHDBnPs2DFTp04dU61aNXPw4MHr1p7b+lesWGEkmWXLltnNr1evnt2xv9lj0bp1axMQEGAuXrxo1/++++4zd999t9VWv35906FDhxvu09Wytvnee+/ZtXfp0sW4ubmZ/fv3W21Hjx41np6epkWLFlZb1vG9//77rztGsvz3v/81Li4uZu3atXbtM2bMMJLMTz/9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atSQJC1YsED33XdfvhcIAAAAALixPD9Q5VouXrwoV1dXFS5cOD9W97fDA1UKFh6oAgAAAEf52zxQRZISExP12WefafTo0Tp9+rQkaefOnXYvEgcAAAAA3Dl5fon51q1b1bp1a/n4+OjgwYMaMGCASpYsqa+//lqHDh3Sl19+eTvqBAAAAABcR57P3EVERKhPnz7au3evihQpYrW3b99ea9asydfiAAAAAAC5k+dwt2HDBj377LPZ2itWrKj4+Ph8KQoAAAAAkDd5Dnfu7u5KTk7O1v7777+rTJky+VIUAAAAACBv8hzuHn74Yb3++utKT0+XJNlsNh06dEgjR45U165d871AAAAAAMCN5Tncvf/++zp37pzKli2rCxcuqGXLlqpRo4Y8PT311ltv3Y4aAQAAAAA3kOenZXp7eysqKkrr1q3T1q1bde7cOTVo0EAhISG3oz4AAAAAQC7k20vM/+l4iXnBwq8aAAAAjuKobJCrM3eTJ0/O9Qqff/75my4GAAAAAHBzcnXmrmrVqrlbmc2mP/7445aL+jvizF3Bwpk7AAAAOEqBPnN34MCB210HAAAAAOAW5PlpmQAAAACAgifP4a5r16569913s7VPmDBBjz/+eL4UBQAAAADImzyHuzVr1qh9+/bZ2tu1a6c1a9bkS1EAAAAAgLzJc7g7d+6c3NzcsrUXLlxYycnJ+VIUAAAAACBv8hzuAgICNHfu3Gztc+bMkb+/f74UBQAAAADIm1w9LfNKr776qh599FHt379fDz74oCQpOjpaX331lebPn5/vBQIAAAAAbizP4a5Tp05avHix3n77bS1YsEBFixZVvXr19OOPP6ply5a3o0YAAAAAwA3k6iXmuDFeYl6w8KsGAACAozgqG+T5nruwsDCeigkAAAAABUyew11SUpJCQkJ099136+2339aRI0duR10AAAAAgDzIc7hbvHixjhw5okGDBmnu3LmqUqWK2rVrpwULFig9Pf121AgAAAAAuIE8hztJKlOmjCIiIrRlyxb98ssvqlGjhnr27KkKFSpo2LBh2rt3b37XCQAAAAC4jpsKd1mOHTumqKgoRUVFydXVVe3bt9e2bdvk7++viRMn5leNAAAAAIAbyHO4S09P18KFC9WxY0dVrlxZ8+fP19ChQ3X06FF98cUX+vHHHzVv3jy9/vrrt6NeAAAAAEAO8vye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hQvVrFmzbO333XefFixYkC9FAQAAAADyJs/h7tSpU/L29s7W7uXlpZMnT+ZLUQAAAACAvMlzuKtRo4aWL1+erX3ZsmWqVq1avhQFAAAAAMibPL/EPCIiQoMHD9aJEyf04IMPSpKio6P1/vvva9KkSfldHwAAAAAgF/Ic7vr27avU1FS99dZbeuONNyRJVapU0fTp09WrV698LxAAAAAAcGO5eon5tZw4cUJFixaVh4dHftb0t8RLzAsWXmIOAAAARynQLzHPyYkTJ7Rnzx5JUq1atVS6dOl8KwoAAAAAkDd5fqBKSkqK+vbtq/Lly6tFixZq0aKFypcvr379+un8+fO3o0YAAAAAwA3kOdxFREQoJiZG3333nRITE5WYmKhvvvlGMTExevHFF29HjQAAAACAG8jzPXelS5fWggUL1KpVK7v2VatW6YknntCJEyfys76/De65K1i45w4AAACO4qhskOczd+fPn1e5cuWytZctW5bLMgEAAADAQfIc7oKDgzV27FhdvHjRartw4YJee+01BQcH52txAAAAAIDcyfPTMj/88EOFhoaqUqVKql+/viRpy5YtKlKkiFasWJHvBQIAAAAAbuym3nN3/vx5zZo1S7t375Yk1a5dWz169FDRokXzvcC/C+65K1i45w4AAACO8rd6z12xYsU0YMCA/K4FAAAAAHCTchXuvv3221yv8OGHH77pYgAAAAAANydX4a5Lly65WpnNZlNGRsat1AMAAAAAuAm5CneZmZm3uw4AAAAAwC3I86sQAAAAAAAFT67D3cqVK+Xv76/k5ORs85KSklSnTh2tWbMmX4sDAAAAAOROrsPdpEmTNGDAgBwf5ent7a1nn31WEydOzNfiAAAAAAC5k+twt2XLFrVt2/aa89u0aaONGzfmS1EAAAAAgLzJdbhLSEhQ4cKFrzm/UKFCOnHiRL4UBQAAAADIm1yHu4oVK2r79u3XnL9161aVL18+X4oCAAAAAORNrsNd+/bt9eqrr+rixYvZ5l24cEFjx45Vx44d87U4AAAAAEDu2IwxJjcdExIS1KBBA7m6umrw4MGqWbOmJGn37t2aOnWqMjIytGnTJpUrV+62FlxQJScny9vbW0lJSTk+dOZOs9kcXYFj5e5XDQAAAOQ/R2WDXL3EXJLKlSun9evXa9CgQRo9erSyMqHNZlNoaKimTp36jw12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r7/+aq0z6y8+S5cuNQ0aNDCFCxc2q1atsua3atXKzJgxw0yfPt089NBD2b6D7du3mw4dOhhPT0/j4eFh7r//frNv3z4zduzYbDWtWrXK7i9kGRkZpmLFimbatGl269y0aZOx2Wzm4MGDxhhj3n//fVO3bl1TrFgxU6lSJTNo0CBz9uxZu/qvnMaOHZvtOzLGmD///NM8/PDDpnjx4sbT09M8/vjjJj4+3po/duxYU79+ffPll1+aypUrGy8vL/Pkk0+a5OTkbPudkyZNmpjw8HDrc0ZGhqlQoYIZP358rpYvCBhTjKmCNKaupL/5mTvGFeOqII4rYy6f5ZBkYmJibmp5R2BMMaYK8pgyxpgSJUqYzz77LE/LEO7M/wbeBx98YFq3bm21t27d2kycONFucC9YsMAsXLjQ7N2712zevNl06tTJBAQEmIyMDGOMMb/++quRZH788Udz7Ngxc+rUKWsbHh4epmfPnmb79u1m+/btxpjsP5zhw4ebypUrm8TERLNp0ybj5uZmvvnmG7v51atXN5mZmVbb559/booWLWoSExPNvn37TPHixc3EiRPN77//bn766Sdz7733mt69e1v9n3jiCePn52e+/vprs3//fvPjjz+aOXPmmEuXLpmFCxcaSWbPnj3m2LFjJjEx0RhjzPPPP28qVKhgli5danbs2GHCwsJMiRIlrP3LGhz16tUzP/zwg9m3b581b9++fcbd3d2cPn3anDp1yhQpUsQacMYY89dff5mSJUuaRx991GzYsMHs2bPHfP7552b37t3m7Nmz5oknnjBt27Y1x44dM8eOHTOpqanZLn946aWXzP3332/3vb744ot2bRMnTjQrV640Bw4cMNHR0aZmzZpm0KBBxhhjUlNTzaRJk4yXl5e1nayBf+V3lJGRYQIDA839999vfvvtN/Pzzz+bhg0bWv+IG3N5cHt4eJhHH33UbNu2zaxZs8b4+vqaf/3rX9f8DWZJTU01rq6u2f7js1evXubhhx++4fIFBWOKMVVQxtTVnCHcMa4YVwVtXBljzN69e40ks23btpta3hEYU4ypgjqmLl26ZL766ivj5uZmduzYkadlCXfmf4P7+PHjxt3d3Rw8eNAcPHjQFClSxJw4ccJucF/txIkTdv+YXeua67CwMFOuXDmTmppq13714E5NTTWBgYHmiSeeMP7+/mbAgAF2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lFDx4sVVp04dLV269Kb2AwBwZxHuAAAO5erqqrffflsfffSR/vrrrxz77N+/X23btlXXrl21detWzZ07V+vWrdPgwYMlSV9//bUqVaqk119/XceOHdOxY8dks9nUokULrV69WpJ05swZ7dq1SxcuXNDu3bslSTExMWrcuLGKFSumzMxMde7cWadPn1ZMTIyioqL0xx9/6Mknn7SrZd++fVq4cKG+/vrrHC+rnD17trp3765Zs2apR48eN3VMzp07p/bt2ys6OlqbN29W27Zt1alTJx06dEiS1LdvX+3atUsbNmywltm8ebO2bt2qPn36SJJmzZqlMWPG6K233tKuXbv09ttv69VXX9UXX3xht61Ro0bphRde0K5duxQaGqrw8HClpqZqzZo12rZtm9599115eHjc1H4AAO6sQo4uAACARx55RIGBgRo7dqz+85//ZJs/fvx49ejRw3poyd13363JkyerZcuWmj59ukqWLClXV1d5enrK19fXWq5Vq1b6+OOPJUlr1qzRvffeK19fX61evVq1atXS6tWr1bJlS0lSdHS0tm3bpgMHDsjPz0+S9OWXX6pOnTrasGGDGjduLOnypZhffvmlypQpk63OqVOn6uWXX9Z3331nrfdm1K9fX/Xr17c+v/HGG1q0aJG+/fZbDR48WJUqVVJoaKhmzpxp1TVz5ky1bNlS1apVkySNHTtW77//vh599FFJUtWqVbVz5059/PHHCgsLs9Y9dOhQq490+exl165dFRAQIEnW+gAABR9n7gAABcK7776rL774Qrt27co2b8uWLYqMjJSHh4c1hYaGKjMzUwcOHLjmOlu2bKmdO3fqxIkTiomJUatWrdSqVSutXr1a6enpWr9+vVq1aiVJ2rVrl/z8/KxgJ0n+/v7y8fGxq6ly5co5BrsFCxZo2LBhioqKuqVgJ10+c/fSSy+pdu3a8vHxkYeHh3bt2mWduZOkAQMG6KuvvtLFixeVlpam2bNnq2/fvpKklJQU7d+/X/369bM7Zm+++ab2799vt61GjRrZfX7++ef15ptvqlmzZho7dqy2bt16S/sCALhzCHcAgAKhRYsWCg0N1ejRo7PNO3funJ599lnFxcVZ05YtW7R3715Vr179musMCAhQyZIlFRMTYxfuYmJitGHDBqWnp+u+++7LU53FixfPsf3ee+9VmTJl9Pnnn8sYk6d1Xu2ll17SokWL9Pbbb2vt2rWKi4tTQECA3QNcOnXqJHd3dy1atEjfffed0tPT9dhjj0m6fLwk6dNPP7U7Ztu3b9fPP/983f3p37+//vjjD/Xs2VPbtm1To0aN9NFHH93S/gAA7gwuywQAFBjvvPOOAgMDVbNmTbv2Bg0aaOfOnapRo8Y1l3Vzc1NGRoZdm81mU/PmzfXNN99ox44duv/++1WsWDGlpqbq448/VqNGjaxwU7t2bR0+fFiHDx+2zt7t3LlTiYmJ8vf3v2Ht1atX1/vvv69WrVrJ1dVVU6ZMyevuW3766Sf17t1bjzzyiKTLYe3gwYN2fQoVKqSwsDDNnDlTbm5u6tatm4oWLSpJKleunCpUqKA//vjjpu778/Pz08CBAzVw4ECNHj1an376qYYMGXLT+wMAuDMIdwCAAiMgIEA9evTQ5MmT7dpHjhyppk2bavDgwerfv7+KFy+unTt3KioqygpRVapU0Zo1a9StWze5u7urdOnSki7fd/fiiy+qUaNG1oNBWrRooVmzZmn48OHWNkJCQqztT5o0SZcuXdJzzz2nli1bZrt08VruuecerVq1Sq1atVKhQoVu+N69PXv2ZGurU6eO7r77bn399dfq1KmTbDabXn31VWVmZmbr279/f9WuXVvS5UB4pddee03PP/+8vL291bZtW6Wmpuq3337TmTNnFBERcc2ahg4dqnbt2umee+7RmTNntGrVKmsbAICCjcsyAQAFyuuvv54tyNSrV08xMTH6/fff1bx5c917770aM2aMKlSoYLfcwYMHVb16dbt74lq2bKmMjAzr3jrpcuC7us1ms+mbb75RiRIl1KJFC4WEhKhatWqaO3dunuqvWbOmVq5cqa+++kovvvjidft269ZN9957r92UkJCgDz74QCVKlNB9992nTp06KTQ0VA0aNMi2/N1336377rtPtWrVUlBQkN28/v3767PPPtPMmTMVEBCgli1bKjIyUlWrVr1uTRkZGQoPD1ft2rXVtm1b3XPPPXavUAAAFFw2c6s3BgAAAIcwxujuu+/Wc889d92zcQCAfwYuywQA4G/oxIkTmjNnjuLj46132wEA/tkIdwAA/A2VLVtWpUuX1ieffKISJUo4uhwAQAFAuAMA4G+IuyoAAFfjgSoAAAAA4AQIdwAAAADgBAh3AAAAAOAECHcAAAAA4AQIdwAAAADgBAh3AAAAAOAECHcAAAAA4AQIdwAAAADgBP4/da6Cud3tvjMAAAAASUVORK5CYII=", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3cAAAHWCAYAAADU7HB0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAA9hAAAPYQGoP6dpAABwo0lEQVR4nO3de3zO9f/H8ee1sTnM5jRGZkTFMMt5yaEsK1OEosQckoQwOax8naqv6ISETozvlxRKRWjmVCwKy1kOcyiGsM1xY3v//vDb5+uyYRfjWleP++32ueV6f96f9+f1+VzX+2qv6/P5vN82Y4wRAAAAAOBvzc3ZAQAAAAAAbh3JHQAAAAC4AJI7AAAAAHABJHcAAAAA4AJI7gAAAADABZDcAQAAAIALILkDAAAAABdAcgcAAAAALoDkDgAAAABcAMkdgNuqadOmatq0qbPDyFX79++XzWZTdHS0s0PJFbt371bz5s3l4+Mjm82mBQsW3FJ7NptNI0eOzJXYrrZy5UrZbDbNmzfvtrSf227nubiWo0ePql27dipRooRsNpvGjx9/R/d/J3Tp0kVeXl7ODiPPs9ls6tOnz01tW6FCBXXp0iV3AwJw25HcAf9Q0dHRstls11x+/vnnHLe1fft2jRw5Uvv37799Ad+EyZMnu0wCdjtFRERoy5YtevPNN/Wf//xHderUcXZIuAUDBgzQ0qVLFRUVpf/85z969NFHnR2Syzt37pxGjhyplStXOjsUAP9w+ZwdAADnGj16tCpWrJilvHLlyjluY/v27Ro1apSaNm2qChUq2K374YcfbjXEmzZ58mSVLFmSX5+v4/z584qLi9Nrr71207/wI29Zvny5WrVqpVdeecXZofxjnDt3TqNGjZIkl7tTAcDfC8kd8A/32GOP3dYrNR4eHretbdy648ePS5KKFi3q3ECQa44dO5ar7+eFCxfk4eEhNzdu9vk7MMbowoULKliwoLNDuW0uXbqkjIwM/v8CZINvagA3NGfOHNWuXVtFihSRt7e3atSooQkTJki6fHvnU089JUl66KGHrNs6M29PuvqZu8xnpr788kuNGjVKd911l4oUKaJ27dopOTlZqamp6t+/v0qVKiUvLy917dpVqampdvFMnz5dDz/8sEqVKiVPT08FBgZqypQpdnUqVKigbdu2adWqVVZMV8aRlJSk/v37y9/fX56enqpcubLGjh2rjIwMu3aSkpLUpUsX+fj4qGjRooqIiFBSUlKOzlvmra9r1qxRZGSkfH19VbhwYT355JNWUnWlyZMnq1q1avL09FTZsmXVu3fvHO8rO5s2bdJjjz0mb29veXl5qVmzZna3244cOVIBAQGSpEGDBslms2W58nq1CxcuaOTIkbr33ntVoEABlSlTRm3atNHevXtvKZZMSUlJGjBggCpUqCBPT0+VK1dOnTt31l9//XXNtlNTU9WyZUv5+Pho7dq1Nx2/MUYVKlRQq1atst3Ox8dHPXv2vOVz8eeff6pbt24qXbq0PD09Va1aNU2bNi1LvQ8++EDVqlVToUKFVKxYMdWpU0ezZ8++ZruZnzdjjD788EPrc59p3759euqpp1S8eHEVKlRIDRo00KJFi+zayOyfc+bM0bBhw3TXXXepUKFCSklJueZ+MzIyNH78eFWrVk0FChRQ6dKl1bNnT506dcqu3jfffKPw8HCVLVtWnp6eqlSpkl5//XWlp6dnaXPdunVq0aKFihUrpsKFCysoKMj6zrn6XLZu3VpeXl7y9fXVK6+8km17V6tQoYJatmypn376SfXq1VOBAgV09913a+bMmVnq3ui7Yv/+/fL19ZUkjRo1yjrvI0eO1LfffiubzabNmzdb7c2fP182m01t2rSx20/VqlXVvn176/WlS5f0+uuvq1KlSvL09FSFChX06quvZvk+zDyWpUuXqk6dOipYsKA++uijax77G2+8ITc3N33wwQc3PE9XOnnypF555RXVqFFDXl5e8vb21mOPPabffvvNqnPmzBkVLlxY/fr1y7L9H3/8IXd3d40ZM8Yqy8n3cOYzzu+8847Gjx9vnY/t27c7FD/wT8GVO+AfLjk5OcsfzjabTSVKlJAkxcTE6JlnnlGzZs00duxYSdKOHTu0Zs0a9evXT40bN9bLL7+siRMn6tVXX1XVqlUlyfrvtYwZM0YFCxbU0KFDtWfPHn3wwQfKnz+/3NzcdOrUKY0cOVI///yzoqOjVbFiRQ0fPtzadsqUKapWrZqeeOIJ5cuXT999951eeuklZWRkqHfv3pKk8ePHq2/fvvLy8tJrr70mSSpdurSky7dQNWnSRH/++ad69uyp8uXLa+3atYqKitKRI0esASiMMWrVqpV++uknvfjii6pataq+/vprRUREOHSO+/btq2LFimnEiBHav3+/xo8frz59+uiLL76w6owcOVKjRo1SaGioevXqpV27dmnKlCn65ZdftGbNGuXPn9+hfW7btk2NGjWSt7e3Bg8erPz58+ujjz5S06ZNtWrVKtWvX19t2rRR0aJFNWDAAD3zzDNq0aLFdQepSE9PV8uWLRUbG6sOHTqoX79+On36tGJiYrR161ZVqlTppmORLv9h2KhRI+3YsUPdunVTrVq19Ndff+nbb7/VH3/8oZIlS2Zp+/z582rVqpV+/fVXLVu2THXr1r2l+J977jmNGzdOJ0+eVPHixa1tv/vuO6WkpOi55567pXNx9OhRNWjQwBrowtfXV4sXL1b37t2VkpKi/v37S5I++eQTvfzyy2rXrp369eunCxcuaPPmzVq3bp2effbZbNtu3Lix/vOf/6hTp0565JFH1LlzZ7v9PvDAAzp37pxefvlllShRQjNmzNATTzyhefPm6cknn7Rr6/XXX5eHh4deeeUVpaamXvcKSc+ePRUdHa2uXbvq5ZdfVkJCgiZNmqRNmzbZfXajo6Pl5eWlyMhIeXl5afny5Ro+fLhSUlL09ttvW+3FxMSoZcuWKlOmjPr16yc/Pz/t2LFDCxcutEsa0tPTFRYWpvr16+udd97RsmXL9O6776pSpUrq1avXNePNtGfPHrVr107du3dXRESEpk2bpi5duqh27dqqVq2apJx9V/j6+mrKlCnq1auXnnzySStpCwoKUrly5WSz2bR69WoFBQVJkn788Ue5ubnpp59+smI5fvy4du7caXdr9PPPP68ZM2aoXbt2GjhwoNatW6cxY8Zox44d+vrrr+2OZdeuXXrmmWfUs2dP9ejRQ/fdd1+2xzxs2DD9+9//1kcffaQePXrc8Bxdad++fVqwYIGeeuopVaxYUUePHtVHH32kJk2aaPv27Spbtqy8vLz05JNP6osvvtB7770nd3d3a/vPP/9cxhh17Ngxx+f2StOnT9eFCxf0wgsvyNPT065/AriCAfCPNH36dCMp28XT09Oq169fP+Pt7W0uXbp0zbbmzp1rJJkVK1ZkWdekSRPTpEkT6/WKFSuMJFO9enWTlpZmlT/zzDPGZrOZxx57zG77kJAQExAQYFd27ty5LPsJCwszd999t11ZtWrV7Pad6fXXXzeFCxc2v//+u1350KFDjbu7uzl48KAxxpgFCxYYSWbcuHFWnUuXLplGjRoZSWb69OlZ2r5S5jkODQ01GRkZVvmAAQOMu7u7SUpKMsYYc+zYMePh4WGaN29u0tPTrXqTJk0yksy0adOuu5/stG7d2nh4eJi9e/daZYcPHzZFihQxjRs3tsoSEhKMJPP222/fsM1p06YZSea9997Lsu7K45NkRowY4XAsw4cPN5LMV199dc32Mz8/c+fONadPnzZNmjQxJUuWNJs2bcqV+Hft2mUkmSlTptitf+KJJ0yFChWsejd7Lrp3727KlClj/vrrL7ttOnToYHx8fKzPdqtWrUy1atVueEzZkWR69+5tV9a/f38jyfz4449W2enTp03FihVNhQoVrM9d5vm9++67s+1nV/vxxx+NJDNr1iy78iVLlmQpz669nj17mkKFCpkLFy4YYy73r4oVK5qAgABz6tQpu7pXnteIiAgjyYwePdquzv33329q1659w7gDAgKMJLN69Wqr7NixY8bT09MMHDjQKsvpd8Xx48ezvNeZqlWrZp5++mnrda1atcxTTz1lJJkdO3YYY4z56quvjCTz22+/GWOMiY+PN5LM888/b9fWK6+8YiSZ5cuXZzmWJUuWZNn3lZ+FgQMHGjc3NxMdHX3D85PZbkREhPX6woULdt9Pxlz+/vD09LR7H5YuXWokmcWLF9vVDQoKsvs+zum5zfyO8vb2NseOHctR7MA/GbdlAv9wH374oWJiYuyWxYsXW+uLFi2qs2fPKiYmJlf327lzZ7urUfXr15cxRt26dbOrV79+fR06dEiXLl2yyq58liTzymOTJk20b98+JScn33Dfc+fOVaNGjVSsWDH99ddf1hIaGqr09HStXr1akvT9998rX758dlcB3N3d1bdvX4eO9YUXXrC7Pa5Ro0ZKT0/XgQMHJEnLli1TWlqa+vfvb/dcU48ePeTt7Z3l1rkbSU9P1w8//KDWrVvr7rvvtsrLlCmjZ599Vj/99NN1b7O7lvnz56tkyZLZHv+Vx3ezscyfP181a9bMchUpu/aTk5PVvHlz7dy5UytXrlRwcHCuxH/vvfeqfv36mjVrlrXu5MmTWrx4sTp27GjVu5lzYYzR/Pnz9fjjj8sYY/fZCwsLU3JysjZu3Cjpcr/7448/9Msvv9zwuHLi+++/V7169fTggw9aZV5eXnrhhRe0f//+LLe4RURE5OiZrblz58rHx0ePPPKI3fHUrl1bXl5eWrFihVX3yvZOnz6tv/76S40aNdK5c+e0c+dOSZdv301ISFD//v2zPDeY3Xl98cUX7V43atRI+/btu2HckhQYGKhGjRpZr319fXXffffZbZ/T74rradSokX788UfruH/77Te98MILKlmypFX+448/qmjRoqpevbqky++XJEVGRtq1NXDgQEnK8p1QsWJFhYWFZbt/Y4z69OmjCRMm6L///a/Ddx5k8vT0tL6f0tPTdeLECXl5eem+++6zPreSFBoaqrJly9r1oa1bt2rz5s3WlW/J8XPbtm1b6/ZXANfGbZnAP1y9evWuO6DKSy+9pC+//FKPPfaY7rrrLjVv3lxPP/30LQ+vXr58ebvXPj4+kiR/f/8s5RkZGUpOTrZuFV2zZo1GjBihuLg4nTt3zq5+cnKy1da17N69W5s3b77mHwrHjh2TJB04cEBlypTJcqvitW55uparj7VYsWKSZD2TlJnkXd2uh4eH7r77bmt9Th0/flznzp3LNs6qVasqIyNDhw4dsm49y6m9e/fqvvvuU758Of9fhyOx7N27V23bts1Ru/3799eFCxe0adOmHB9HTuPv3Lmz+vTpowMHDiggIEBz587VxYsX1alTJ4fbutLx48eVlJSkjz/+WB9//HG2dTI/e0OGDNGyZctUr149Va5cWc2bN9ezzz6rhg0b5nh/Vzpw4IB1++uVMm+fPnDggJVYSMp2BN3s7N69W8nJySpVqlS26zOPR7p8e+6wYcO0fPnyLD8uZP4ok/m84pWxXEuBAgWy9OFixYpledbvWq7ul9ltn9Pviutp1KiRpk6dqj179mjv3r2y2WwKCQmxkr4ePXroxx9/VMOGDa3k6cCBA3Jzc8syarGfn5+KFi2a5Tvheu/XzJkzdebMGU2ZMkXPPPPMDeO9loyMDE2YMEGTJ09WQkKC3bONmd/NkuTm5qaOHTtqypQpOnfunAoVKqRZs2apQIEC1vPZkuPnNqefSeCfjuQOwHWVKlVK8fHxWrp0qRYvXqzFixdr+vTp6ty5s2bMmHHT7V75LEZOyo0xki7/8desWTNVqVJF7733nvz9/eXh4aHvv/9e77//fpYBUbKTkZGhRx55RIMHD852/b333pvDo8iZGx0THNeqVSvNmTNHb731lmbOnJmrIzl26NBBAwYM0KxZs/Tqq6/qv//9r+rUqeNwUn+1zM/mc889d82rJ5nPZVWtWlW7du3SwoULtWTJEs2fP1+TJ0/W8OHDrSH3b6ecjrSYkZGhUqVK2V2luVLmH+5JSUlq0qSJvL29NXr0aFWqVEkFChTQxo0bNWTIkBz126tdq1/d6vZX9svc+K7IvFq6evVq7du3T7Vq1VLhwoXVqFEjTZw4UWfOnNGmTZv05ptvZtn2WleBr3a996thw4aKj4/XpEmT9PTTT9/0s2r//ve/9a9//UvdunXT66+/ruLFi8vNzU39+/fP8v517txZb7/9thYsWKBnnnlGs2fPtgY9yuTouXXl0T+B3ERyB+CGPDw89Pjjj+vxxx9XRkaGXnrpJX300Uf617/+pcqVK+f4D5Dc8N133yk1NVXffvut3S/vV97+lelacVWqVElnzpxRaGjodfcVEBCg2NhYnTlzxu7q3a5du24y+mvvJ7PdK29dTEtLU0JCwg3jvJqvr68KFSqUbZw7d+6Um5tbliukOVGpUiWtW7dOFy9ezPEAL47EUqlSJW3dujVH7bZu3VrNmzdXly5dVKRIkSyjpd5K/MWLF1d4eLhmzZqljh07as2aNVkGd7jZc1GkSBGlp6fn6D0tXLiw2rdvr/bt2ystLU1t2rTRm2++qaioKBUoUCBH+8wUEBBwzfcgc/3NqFSpkpYtW6aGDRte94/vlStX6sSJE/rqq6/UuHFjqzwhISFLe9Ll2/gc/dzfDjn9rrjed2D58uVVvnx5/fjjj9q3b591K2jjxo0VGRmpuXPnKj093e68BAQEKCMjQ7t377YbnOro0aNKSkpy6P2qXLmyxo0bp6ZNm+rRRx9VbGysihQpkuPtM82bN08PPfSQPvvsM7vypKSkLIMdVa9eXffff79mzZqlcuXK6eDBg1lG58zpuQXgGJ65A3BdJ06csHvt5uZmXV3IHJK7cOHCknRLw/bnVOav7Vf+up6cnKzp06dnqVu4cOFsY3r66acVFxenpUuXZlmXlJRkPd/XokULXbp0yS5xSE9Pd3gI8RsJDQ2Vh4eHJk6caHdcn332mZKTkxUeHm6VHTx40PqD/Frc3d3VvHlzffPNN9q/f79VfvToUc2ePVsPPvigvL29HY6zbdu2+uuvvzRp0qQs6651FdKRWNq2bavffvsty0iA12q/c+fOmjhxoqZOnaohQ4bkavydOnXS9u3bNWjQILm7u6tDhw433VYmd3d3tW3bVvPnz882ib1yeoyr+52Hh4cCAwNljNHFixevfZDX0KJFC61fv15xcXFW2dmzZ/Xxxx+rQoUKCgwMdLhN6XJfSk9P1+uvv55l3aVLl6z+l12/TUtL0+TJk+22qVWrlipWrKjx48dn6bvOuNKd0++KQoUKWWXZadSokZYvX67169dbyV1wcLCKFCmit956SwULFlTt2rWt+i1atJCkLD8qvPfee5Jk952QE0FBQfr++++1Y8cOPf744zp//rxD20uX38Or34O5c+fqzz//zLZ+p06d9MMPP2j8+PEqUaKEHnvsMbv1OT23ABzDlTvgH27x4sXZJgsPPPCA7r77bj3//PM6efKkHn74YZUrV04HDhzQBx98oODgYOsX5eDgYLm7u2vs2LFKTk6Wp6enNQ9dbmvevLl1JbFnz546c+aMPvnkE5UqVUpHjhyxq1u7dm1NmTJFb7zxhipXrqxSpUrp4Ycf1qBBg/Ttt9+qZcuW1tDnZ8+e1ZYtWzRv3jzt379fJUuW1OOPP66GDRtq6NCh2r9/vwIDA/XVV1/laNAWR/j6+ioqKkqjRo3So48+qieeeEK7du3S5MmTVbduXbtBCDp37qxVq1bd8A/dN954QzExMXrwwQf10ksvKV++fProo4+UmpqqcePG3VScnTt31syZMxUZGWn9kXr27FktW7ZML730UrbzwzkSy6BBgzRv3jw99dRT6tatm2rXrq2TJ0/q22+/1dSpU1WzZs0sbffp00cpKSl67bXX5OPjo1dffTVX4g8PD1eJEiU0d+5cPfbYY1k+yzd7Lt566y2tWLFC9evXV48ePRQYGKiTJ09q48aNWrZsmU6ePCnp8ufcz89PDRs2VOnSpbVjxw5NmjRJ4eHhN3XVZejQofr888/12GOP6eWXX1bx4sU1Y8YMJSQkaP78+Td9W2uTJk3Us2dPjRkzRvHx8WrevLny58+v3bt3a+7cuZowYYLatWunBx54QMWKFVNERIRefvll2Ww2/ec//8nyOXZzc9OUKVP0+OOPKzg4WF27dlWZMmW0c+dObdu2LdtE4HbK6XdFwYIFFRgYqC+++EL33nuvihcvrurVq1vPDjZq1EizZs2SzWazbtN0d3fXAw88oKVLl6pp06Z2003UrFlTERER+vjjj61bWtevX68ZM2aodevWeuihhxw+lgYNGuibb75RixYt1K5dOy1YsMChKVZatmyp0aNHq2vXrnrggQe0ZcsWzZo1y+5ugys9++yzGjx4sL7++mv16tUry75yem4BOOgOj84JII+43lQIumKY/3nz5pnmzZubUqVKGQ8PD1O+fHnTs2dPc+TIEbv2PvnkE3P33Xcbd3d3u2kRrjUVwty5c7ON55dffrErHzFihJFkjh8/bpV9++23JigoyBQoUMBUqFDBjB071hqaPiEhwaqXmJhowsPDTZEiRYwkuzhOnz5toqKiTOXKlY2Hh4cpWbKkeeCBB8w777xjN0XDiRMnTKdOnYy3t7fx8fExnTp1Mps2bXJoKoSrjynzHFw9dcSkSZNMlSpVTP78+U3p0qVNr169sgwH36RJE5PTr+6NGzeasLAw4+XlZQoVKmQeeughs3btWrs6jkyFYMzl4exfe+01U7FiRZM/f37j5+dn2rVrZzfNgbIZEj4nsRhz+Xz36dPH3HXXXcbDw8OUK1fOREREWFMHXOvzM3jwYCPJTJo06Zbjz/TSSy8ZSWb27Nm5ei6OHj1qevfubfz9/a3tmjVrZj7++GOrzkcffWQaN25sSpQoYTw9PU2lSpXMoEGDTHJy8nWPL3OfV0+FYIwxe/fuNe3atTNFixY1BQoUMPXq1TMLFy60q3Ot83sjH3/8saldu7YpWLCgKVKkiKlRo4YZPHiwOXz4sFVnzZo1pkGDBqZgwYKmbNmyZvDgwdaw+Vf3hZ9++sk88sgjpkiRIqZw4cImKCjIfPDBB9b6iIgIU7hw4SxxZH5f3EhAQIAJDw/PUn7195UxOf+uWLt2raldu7bx8PDI8r5v27bNSDJVq1a1a/uNN94wksy//vWvLLFcvHjRjBo1yvp8+fv7m6ioKGvaiBsdizHZfxa++eYbky9fPtO+ffssUxtc3e7VUyEMHDjQlClTxhQsWNA0bNjQxMXFZXvOMrVo0cJIyravG5Ozc+vodxTwT2czhif6AQC42oABA/TZZ58pMTHRuu0OQM49+eST2rJli/bs2ePsUIB/DJ65AwDgKhcuXNB///tftW3blsQOuAlHjhzRokWL7KYQAXD78cwdAAD/79ixY1q2bJnmzZunEydOqF+/fs4OCfhbSUhI0Jo1a/Tpp58qf/786tmzp7NDAv5RSO4AAPh/27dvV8eOHVWqVClNnDhRwcHBzg4J+FtZtWqVunbtqvLly2vGjBny8/NzdkjAPwrP3AEAAACAC+CZOwAAAABwASR3AAAAAOAC8swzd2+99ZaioqLUr18/jR8/XtLl0coGDhyoOXPmKDU1VWFhYZo8ebJKly5tbXfw4EH16tVLK1askJeXlyIiIjRmzBjly/e/Q1u5cqUiIyO1bds2+fv7a9iwYerSpYvd/j/88EO9/fbbSkxMVM2aNfXBBx+oXr16OY4/IyNDhw8fVpEiRWSz2W7pXAAAAAD4+zLG6PTp0ypbtqzc3O7g9TSnzrL3/9avX28qVKhggoKCTL9+/azyF1980fj7+5vY2Fjz66+/mgYNGpgHHnjAWn/p0iVTvXp1ExoaajZt2mS+//57U7JkSRMVFWXV2bdvnylUqJCJjIw027dvNx988IFxd3c3S5YsserMmTPHeHh4mGnTpplt27aZHj16mKJFi5qjR4/m+BgOHTp03QmhWVhYWFhYWFhYWFj+WcuhQ4duLVFykNMHVDlz5oxq1aqlyZMn64033lBwcLDGjx+v5ORk+fr6avbs2WrXrp0kaefOnapatari4uLUoEEDLV68WC1bttThw4etq3lTp07VkCFDdPz4cXl4eGjIkCFatGiRtm7dau2zQ4cOSkpK0pIlSyRJ9evXV926dTVp0iRJl6/C+fv7q2/fvho6dGiOjiM5OVlFixbVoUOH5O3tnZunCAAAAMDfSEpKivz9/ZWUlCQfH587tl+n35bZu3dvhYeHKzQ0VG+88YZVvmHDBl28eFGhoaFWWZUqVVS+fHkruYuLi1ONGjXsbtMMCwtTr169tG3bNt1///2Ki4uzayOzTv/+/SVJaWlp2rBhg6Kioqz1bm5uCg0NVVxc3DXjTk1NVWpqqvX69OnTkiRvb2+SOwAAAAB3/HEtpyZ3c+bM0caNG/XLL79kWZeYmCgPDw8VLVrUrrx06dJKTEy06lyZ2GWuz1x3vTopKSk6f/68Tp06pfT09Gzr7Ny585qxjxkzRqNGjcrZgQIAAADAbea00TIPHTqkfv36adasWSpQoICzwrhpUVFRSk5OtpZDhw45OyQAAAAA/2BOS+42bNigY8eOqVatWsqXL5/y5cunVatWaeLEicqXL59Kly6ttLQ0JSUl2W139OhR+fn5SZL8/Px09OjRLOsz112vjre3twoWLKiSJUvK3d092zqZbWTH09PTugWTWzEBAAAAOJvTkrtmzZppy5Ytio+Pt5Y6deqoY8eO1r/z58+v2NhYa5tdu3bp4MGDCgkJkSSFhIRoy5YtOnbsmFUnJiZG3t7eCgwMtOpc2UZmncw2PDw8VLt2bbs6GRkZio2NteoAAAAAQF7ntGfuihQpourVq9uVFS5cWCVKlLDKu3fvrsjISBUvXlze3t7q27evQkJC1KBBA0lS8+bNFRgYqE6dOmncuHFKTEzUsGHD1Lt3b3l6ekqSXnzxRU2aNEmDBw9Wt27dtHz5cn355ZdatGiRtd/IyEhFRESoTp06qlevnsaPH6+zZ8+qa9eud+hsAAAAAMCtcfpomdfz/vvvy83NTW3btrWbxDyTu7u7Fi5cqF69eikkJESFCxdWRESERo8ebdWpWLGiFi1apAEDBmjChAkqV66cPv30U4WFhVl12rdvr+PHj2v48OFKTExUcHCwlixZkmWQFQAAAADIq5w+z52rSElJkY+Pj5KTk3n+DgAAAPgHc1Zu4LRn7gAAAAAAuYfkDgAAAABcAMkdAAAAALgAkjsAAAAAcAEkdwAAAADgAkjuAAAAAMAFkNwBAAAAgAsguQMAAAAAF5DP2QHg9rDZnB2Bcxnj7AgAAACAO4srdwAAAADgAkjuAAAAAMAFkNwBAAAAgAsguQMAAAAAF0ByBwAAAAAugOQOAAAAAFwAyR0AAAAAuACSOwAAAABwASR3AAAAAOACSO4AAAAAwAWQ3AEAAACACyC5AwAAAAAXQHIHAAAAAC6A5A4AAAAAXADJHQAAAAC4AJI7AAAAAHABJHcAAAAA4AJI7gAAAADABZDcAQAAAIALILkDAAAAABdAcgcAAAAALoDkDgAAAABcAMkdAAAAALgAkjsAAAAAcAEkdwAAAADgAkjuAAAAAMAFkNwBAAAAgAsguQMAAAAAF+DU5G7KlCkKCgqSt7e3vL29FRISosWLF1vrmzZtKpvNZre8+OKLdm0cPHhQ4eHhKlSokEqVKqVBgwbp0qVLdnVWrlypWrVqydPTU5UrV1Z0dHSWWD788ENVqFBBBQoUUP369bV+/frbcswAAAAAcDs4NbkrV66c3nrrLW3YsEG//vqrHn74YbVq1Urbtm2z6vTo0UNHjhyxlnHjxlnr0tPTFR4errS0NK1du1YzZsxQdHS0hg8fbtVJSEhQeHi4HnroIcXHx6t///56/vnntXTpUqvOF198ocjISI0YMUIbN25UzZo1FRYWpmPHjt2ZEwEAAAAAt8hmjDHODuJKxYsX19tvv63u3buradOmCg4O1vjx47Otu3jxYrVs2VKHDx9W6dKlJUlTp07VkCFDdPz4cXl4eGjIkCFatGiRtm7dam3XoUMHJSUlacmSJZKk+vXrq27dupo0aZIkKSMjQ/7+/urbt6+GDh2a7b5TU1OVmppqvU5JSZG/v7+Sk5Pl7e2dG6filthszo7AufLWpxoAAAD/JCkpKfLx8bnjuUGeeeYuPT1dc+bM0dmzZxUSEmKVz5o1SyVLllT16tUVFRWlc+fOWevi4uJUo0YNK7GTpLCwMKWkpFhX/+Li4hQaGmq3r7CwMMXFxUmS0tLStGHDBrs6bm5uCg0NtepkZ8yYMfLx8bEWf3//WzsBAAAAAHAL8jk7gC1btigkJEQXLlyQl5eXvv76awUGBkqSnn32WQUEBKhs2bLavHmzhgwZol27dumrr76SJCUmJtoldpKs14mJidetk5KSovPnz+vUqVNKT0/Pts7OnTuvGXdUVJQiIyOt15lX7gAAAADAGZye3N13332Kj49XcnKy5s2bp4iICK1atUqBgYF64YUXrHo1atRQmTJl1KxZM+3du1eVKlVyYtSSp6enPD09nRoDAAAAAGRy+m2ZHh4eqly5smrXrq0xY8aoZs2amjBhQrZ169evL0nas2ePJMnPz09Hjx61q5P52s/P77p1vL29VbBgQZUsWVLu7u7Z1slsAwAAAADyOqcnd1fLyMiwG6jkSvHx8ZKkMmXKSJJCQkK0ZcsWu1EtY2Ji5O3tbd3aGRISotjYWLt2YmJirOf6PDw8VLt2bbs6GRkZio2NtXv2DwAAAADyMqfelhkVFaXHHntM5cuX1+nTpzV79mytXLlSS5cu1d69ezV79my1aNFCJUqU0ObNmzVgwAA1btxYQUFBkqTmzZsrMDBQnTp10rhx45SYmKhhw4apd+/e1i2TL774oiZNmqTBgwerW7duWr58ub788kstWrTIiiMyMlIRERGqU6eO6tWrp/Hjx+vs2bPq2rWrU84LAAAAADjKqcndsWPH1LlzZx05ckQ+Pj4KCgrS0qVL9cgjj+jQoUNatmyZlWj5+/urbdu2GjZsmLW9u7u7Fi5cqF69eikkJESFCxdWRESERo8ebdWpWLGiFi1apAEDBmjChAkqV66cPv30U4WFhVl12rdvr+PHj2v48OFKTExUcHCwlixZkmWQFQAAAADIq/LcPHd/V86ay+JamOfO2REAAADgn+ofP88dAAAAAODmkdwBAAAAgAsguQMAAAAAF0ByBwAAAAAugOQOAAAAAFwAyR0AAAAAuACSOwAAAABwASR3AAAAAOACSO4AAAAAwAWQ3AEAAACACyC5AwAAAAAXQHIHAAAAAC6A5A4AAAAAXADJHQAAAAC4AJI7AAAAAHABJHcAAAAA4AJI7gAAAADABZDcAQAAAIALILkDAAAAABdAcgcAAAAALoDkDgAAAABcAMkdAAAAALgAkjsAAAAAcAEkdwAAAADgAkjuAAAAAMAFkNwBAAAAgAsguQMAAAAAF0ByBwAAAAAugOQOAAAAAFwAyR0AAAAAuACSOwAAAABwASR3AAAAAOACSO4AAAAAwAWQ3AEAAACACyC5AwAAAAAXQHIHAAAAAC7AqcndlClTFBQUJG9vb3l7eyskJESLFy+21l+4cEG9e/dWiRIl5OXlpbZt2+ro0aN2bRw8eFDh4eEqVKiQSpUqpUGDBunSpUt2dVauXKlatWrJ09NTlStXVnR0dJZYPvzwQ1WoUEEFChRQ/fr1tX79+ttyzAAAAABwOzg1uStXrpzeeustbdiwQb/++qsefvhhtWrVStu2bZMkDRgwQN99953mzp2rVatW6fDhw2rTpo21fXp6usLDw5WWlqa1a9dqxowZio6O1vDhw606CQkJCg8P10MPPaT4+Hj1799fzz//vJYuXWrV+eKLLxQZGakRI0Zo48aNqlmzpsLCwnTs2LE7dzIAAAAA4BbYjDHG2UFcqXjx4nr77bfVrl07+fr6avbs2WrXrp0kaefOnapatari4uLUoEEDLV68WC1bttThw4dVunRpSdLUqVM1ZMgQHT9+XB4eHhoyZIgWLVqkrVu3Wvvo0KGDkpKStGTJEklS/fr1VbduXU2aNEmSlJGRIX9/f/Xt21dDhw7NUdwpKSny8fFRcnKyvL29c/OU3BSbzdkROFfe+lQDAADgn8RZuUGeeeYuPT1dc+bM0dmzZxUSEqINGzbo4sWLCg0NtepUqVJF5cuXV1xcnCQpLi5ONWrUsBI7SQoLC1NKSop19S8uLs6ujcw6mW2kpaVpw4YNdnXc3NwUGhpq1clOamqqUlJS7BYAAAAAcBanJ3dbtmyRl5eXPD099eKLL+rrr79WYGCgEhMT5eHhoaJFi9rVL126tBITEyVJiYmJdold5vrMdderk5KSovPnz+uvv/5Senp6tnUy28jOmDFj5OPjYy3+/v43dfwAAAAAkBucntzdd999io+P17p169SrVy9FRERo+/btzg7rhqKiopScnGwthw4dcnZIAAAAAP7B8jk7AA8PD1WuXFmSVLt2bf3yyy+aMGGC2rdvr7S0NCUlJdldvTt69Kj8/PwkSX5+fllGtcwcTfPKOlePsHn06FF5e3urYMGCcnd3l7u7e7Z1MtvIjqenpzw9PW/uoAEAAAAglzn9yt3VMjIylJqaqtq1ayt//vyKjY211u3atUsHDx5USEiIJCkkJERbtmyxG9UyJiZG3t7eCgwMtOpc2UZmncw2PDw8VLt2bbs6GRkZio2NteoAAAAAQF7n1Ct3UVFReuyxx1S+fHmdPn1as2fP1sqVK7V06VL5+Pioe/fuioyMVPHixeXt7a2+ffsqJCREDRo0kCQ1b95cgYGB6tSpk8aNG6fExEQNGzZMvXv3tq6qvfjii5o0aZIGDx6sbt26afny5fryyy+1aNEiK47IyEhFRESoTp06qlevnsaPH6+zZ8+qa9euTjkvAAAAAOAopyZ3x44dU+fOnXXkyBH5+PgoKChIS5cu1SOPPCJJev/99+Xm5qa2bdsqNTVVYWFhmjx5srW9u7u7Fi5cqF69eikkJESFCxdWRESERo8ebdWpWLGiFi1apAEDBmjChAkqV66cPv30U4WFhVl12rdvr+PHj2v48OFKTExUcHCwlixZkmWQFQAAAADIq/LcPHd/V8xzl7fwqQYAAICz/OPnuQMAAAAA3DySOwAAAABwASR3AAAAAOACSO4AAAAAwAWQ3AEAAACACyC5AwAAAAAXQHIHAAAAAC6A5A4AAAAAXIDDyd358+d17tw56/WBAwc0fvx4/fDDD7kaGAAAAAAg5xxO7lq1aqWZM2dKkpKSklS/fn29++67atWqlaZMmZLrAQIAAAAAbszh5G7jxo1q1KiRJGnevHkqXbq0Dhw4oJkzZ2rixIm5HiAAAAAA4MYcTu7OnTunIkWKSJJ++OEHtWnTRm5ubmrQoIEOHDiQ6wECAAAAAG7M4eSucuXKWrBggQ4dOqSlS5eqefPmkqRjx47J29s71wMEAAAAANyYw8nd8OHD9corr6hChQqqV6+eQkJCJF2+inf//ffneoAAAAAAgBuzGWOMoxslJibqyJEjqlmzptzcLueH69evl7e3t6pUqZLrQf4dpKSkyMfHR8nJyXniCqbN5uwInMvxTzUAAACQO5yVG9zUPHd+fn4qUqSIYmJidP78eUlS3bp1/7GJHQAAAAA4m8PJ3YkTJ9SsWTPde++9atGihY4cOSJJ6t69uwYOHJjrAQIAAAAAbszh5G7AgAHKnz+/Dh48qEKFClnl7du315IlS3I1OAAAAABAzuRzdIMffvhBS5cuVbly5ezK77nnHqZCAAAAAAAncfjK3dmzZ+2u2GU6efKkPD09cyUoAAAAAIBjHE7uGjVqpJkzZ1qvbTabMjIyNG7cOD300EO5GhwAAAAAIGccvi1z3LhxatasmX799VelpaVp8ODB2rZtm06ePKk1a9bcjhgBAAAAADfg8JW76tWr6/fff9eDDz6oVq1a6ezZs2rTpo02bdqkSpUq3Y4YAQAAAAA3cFOTmCMrJjHPW/hUAwAAwFmclRvk6LbMzZs357jBoKCgmw4GAAAAAHBzcpTcBQcHy2az6UYX+Ww2m9LT03MlMAAAAABAzuUouUtISLjdcQAAAAAAbkGOkruAgIDbHQcAAAAA4BY4PFrmmDFjNG3atCzl06ZN09ixY3MlKAAAAACAYxxO7j766CNVqVIlS3m1atU0derUXAkKAAAAAOAYh5O7xMRElSlTJku5r6+vjhw5kitBAQAAAAAc43By5+/vrzVr1mQpX7NmjcqWLZsrQQEAAAAAHJOjAVWu1KNHD/Xv318XL17Uww8/LEmKjY3V4MGDNXDgwFwPEAAAAABwYw4nd4MGDdKJEyf00ksvKS0tTZJUoEABDRkyRFFRUbkeIAAAAADgxmzmRjOTX8OZM2e0Y8cOFSxYUPfcc488PT1zO7a/lZSUFPn4+Cg5OVne3t7ODkc2m7MjcK6b+1QDAAAAt85ZuYHDz9xNnz5d58+fl5eXl+rWravq1av/4xM7AAAAAHA2h5O7oUOHqnTp0urevbvWrl17O2ICAAAAADjI4eTuzz//1IwZM/TXX3+padOmqlKlisaOHavExESHdz5mzBjVrVtXRYoUUalSpdS6dWvt2rXLrk7Tpk1ls9nslhdffNGuzsGDBxUeHq5ChQqpVKlSGjRokC5dumRXZ+XKlapVq5Y8PT1VuXJlRUdHZ4nnww8/VIUKFVSgQAHVr19f69evd/iYAAAAAMAZHE7u8uXLpyeffFLffPONDh06pB49emjWrFkqX768nnjiCX3zzTfKyMjIUVurVq1S79699fPPPysmJkYXL15U8+bNdfbsWbt6PXr00JEjR6xl3Lhx1rr09HSFh4crLS1Na9eu1YwZMxQdHa3hw4dbdRISEhQeHq6HHnpI8fHx6t+/v55//nktXbrUqvPFF18oMjJSI0aM0MaNG1WzZk2FhYXp2LFjjp4iAAAAALjjbnpAlUzr1q3TtGnTNGPGDJUpU0anTp1SsWLFNH36dDVt2tShto4fP65SpUpp1apVaty4saTLV+6Cg4M1fvz4bLdZvHixWrZsqcOHD6t06dKSpKlTp2rIkCE6fvy4PDw8NGTIEC1atEhbt261tuvQoYOSkpK0ZMkSSVL9+vVVt25dTZo0SZKUkZEhf39/9e3bV0OHDr1h7AyokrcwoAoAAACc5W8zoIokHT16VO+8846qVaumpk2bKiUlRQsXLlRCQoL+/PNPPf3004qIiHC43eTkZElS8eLF7cpnzZqlkiVLqnr16oqKitK5c+esdXFxcapRo4aV2ElSWFiYUlJStG3bNqtOaGioXZthYWGKi4uTJKWlpWnDhg12ddzc3BQaGmrVuVpqaqpSUlLsFgAAAABwFofnuXv88ce1dOlS3XvvverRo4c6d+5sl4wVLlxYAwcO1Ntvv+1QuxkZGerfv78aNmyo6tWrW+XPPvusAgICVLZsWW3evFlDhgzRrl279NVXX0mSEhMT7RI7SdbrzOcAr1UnJSVF58+f16lTp5Senp5tnZ07d2Yb75gxYzRq1CiHjhEAAAAAbheHk7vM2yZDQkKuWcfX11cJCQkOtdu7d29t3bpVP/30k135Cy+8YP27Ro0aKlOmjJo1a6a9e/eqUqVKjgWfi6KiohQZGWm9TklJkb+/v9PiAQAAAPDP5nBy99lnn92wjs1mU0BAQI7b7NOnjxYuXKjVq1erXLly161bv359SdKePXtUqVIl+fn5ZRnV8ujRo5IkPz8/67+ZZVfW8fb2VsGCBeXu7i53d/ds62S2cTVPT0/m9wMAAACQZzj8zN3LL7+siRMnZimfNGmS+vfv71Bbxhj16dNHX3/9tZYvX66KFSvecJv4+HhJUpkyZSRJISEh2rJli92oljExMfL29lZgYKBVJzY21q6dmJgY6+qjh4eHateubVcnIyNDsbGx171CCQAAAAB5hcPJ3fz589WwYcMs5Q888IDmzZvnUFu9e/fWf//7X82ePVtFihRRYmKiEhMTdf78eUnS3r179frrr2vDhg3av3+/vv32W3Xu3FmNGzdWUFCQJKl58+YKDAxUp06d9Ntvv2np0qUaNmyYevfubV1Ze/HFF7Vv3z4NHjxYO3fu1OTJk/Xll19qwIABViyRkZH65JNPNGPGDO3YsUO9evXS2bNn1bVrV0dPEQAAAADccQ7flnnixAn5+PhkKff29tZff/3lUFtTpkyRpCxTJkyfPl1dunSRh4eHli1bpvHjx+vs2bPy9/dX27ZtNWzYMKuuu7u7Fi5cqF69eikkJESFCxdWRESERo8ebdWpWLGiFi1apAEDBmjChAkqV66cPv30U4WFhVl12rdvr+PHj2v48OFKTExUcHCwlixZkmWQFQAAAADIixye56569ep68cUX1adPH7vyDz74QFOmTNH27dtzNcC/C+a5y1uY5w4AAADO4qzcwOErd5GRkerTp4+OHz+uhx9+WJIUGxurd99995oTjQMAAAAAbi+Hk7tu3bopNTVVb775pl5//XVJUoUKFTRlyhR17tw51wMEAAAAANyYw7dlXun48eMqWLCgvLy8cjOmvyVuy8xbuC0TAAAAzvK3uS3zSr6+vrkVBwAAAADgFjg8FQIAAAAAIO8huQMAAAAAF0ByBwAAAAAuwOHk7o8//rjmup9//vmWggEAAAAA3ByHk7vmzZvr5MmTWcrXrFmjRx99NFeCAgAAAAA4xuHkrkGDBmrevLlOnz5tla1evVotWrTQiBEjcjU4AAAAAEDOOJzcffrppypfvrwef/xxpaamasWKFQoPD9fo0aM1YMCA2xEjAAAAAOAGHE7u3NzcNGfOHOXPn18PP/ywnnjiCY0ZM0b9+vW7HfEBAAAAAHLAZowxN6q0efPmLGWnT5/WM888o/DwcPXq1csqDwoKyt0I/yacNQv9tdhszo7AuW78qQYAAABuD2flBjlK7tzc3GSz2XRl1StfZ/7bZrMpPT399kWbh5Hc5S0kdwAAAHAWZ+UG+XJSKSEh4XbHAQAAAAC4BTlK7gICAm53HAAAAACAW+DwgCpjxozRtGnTspRPmzZNY8eOzZWgAAAAAACOcTi5++ijj1SlSpUs5dWqVdPUqVNzJSgAAAAAgGMcTu4SExNVpkyZLOW+vr46cuRIrgQFAAAAAHCMw8mdv7+/1qxZk6V8zZo1Klu2bK4EBQAAAABwTI4GVLlSjx491L9/f128eFEPP/ywJCk2NlaDBw/WwIEDcz1AAAAAAMCNOZzcDRo0SCdOnNBLL72ktLQ0SVKBAgU0ZMgQRUVF5XqAAAAAAIAby9Ek5tk5c+aMduzYoYIFC+qee+6Rp6dnbsf2t8Ik5nkLk5gDAADAWfL0JObZ8fLysgZW+acndgAAAADgbA4PqJKRkaHRo0fLx8dHAQEBCggIUNGiRfX6668rIyPjdsQIAAAAALgBh6/cvfbaa/rss8/01ltvqWHDhpKkn376SSNHjtSFCxf05ptv5nqQAAAAAIDrc/iZu7Jly2rq1Kl64okn7Mq/+eYbvfTSS/rzzz9zNcC/C565y1t45g4AAADO4qzcwOHbMk+ePKkqVapkKa9SpYpOnjyZK0EBAAAAABzjcHJXs2ZNTZo0KUv5pEmTVLNmzVwJCgAAAADgGIefuRs3bpzCw8O1bNkyhYSESJLi4uJ06NAhff/997keIAAAAADgxhy+ctekSRP9/vvvevLJJ5WUlKSkpCS1adNGu3btUqNGjW5HjAAAAACAG7jpScxhjwFV8hY+1QAAAHCWPD2J+ebNm3PcYFBQ0E0HAwAAAAC4OTlK7oKDg2Wz2XSji3w2m03p6em5EhgAAAAAIOdylNwlJCTc7jgAAAAAALcgR8ldQEDA7Y4DAAAAAHALHB4tc8yYMZo2bVqW8mnTpmns2LG5EhQAAAAAwDEOJ3cfffSRqlSpkqW8WrVqmjp1qkNtjRkzRnXr1lWRIkVUqlQptW7dWrt27bKrc+HCBfXu3VslSpSQl5eX2rZtq6NHj9rVOXjwoMLDw1WoUCGVKlVKgwYN0qVLl+zqrFy5UrVq1ZKnp6cqV66s6OjoLPF8+OGHqlChggoUKKD69etr/fr1Dh0PAAAAADiLw8ldYmKiypQpk6Xc19dXR44ccaitVatWqXfv3vr5558VExOjixcvqnnz5jp79qxVZ8CAAfruu+80d+5crVq1SocPH1abNm2s9enp6QoPD1daWprWrl2rGTNmKDo6WsOHD7fqJCQkKDw8XA899JDi4+PVv39/Pf/881q6dKlV54svvlBkZKRGjBihjRs3qmbNmgoLC9OxY8ccOiYAAAAAcAaH57m75557NGLECD333HN25f/5z380YsQI7du376aDOX78uEqVKqVVq1apcePGSk5Olq+vr2bPnq127dpJknbu3KmqVasqLi5ODRo00OLFi9WyZUsdPnxYpUuXliRNnTpVQ4YM0fHjx+Xh4aEhQ4Zo0aJF2rp1q7WvDh06KCkpSUuWLJEk1a9fX3Xr1tWkSZMkSRkZGfL391ffvn01dOjQG8bOPHd5C/PcAQAAwFmclRs4fOWuR48e6t+/v6ZPn64DBw7owIEDmjZtmgYMGKAePXrcUjDJycmSpOLFi0uSNmzYoIsXLyo0NNSqU6VKFZUvX15xcXGSpLi4ONWoUcNK7CQpLCxMKSkp2rZtm1XnyjYy62S2kZaWpg0bNtjVcXNzU2hoqFXnaqmpqUpJSbFbAAAAAMBZcjRa5pUGDRqkEydO6KWXXlJaWpokqUCBAhoyZIiioqJuOpCMjAz1799fDRs2VPXq1SVdvgXUw8NDRYsWtatbunRpJSYmWnWuTOwy12euu16dlJQUnT9/XqdOnVJ6enq2dXbu3JltvGPGjNGoUaNu7mABAAAAIJc5fOXOZrNp7NixOn78uH7++Wf99ttvOnnypN0zbjejd+/e2rp1q+bMmXNL7dwpUVFRSk5OtpZDhw45OyQAAAAA/2AOX7nL5OXlpbp16+ZKEH369NHChQu1evVqlStXzir38/NTWlqakpKS7K7eHT16VH5+fladq0e1zBxN88o6V4+wefToUXl7e6tgwYJyd3eXu7t7tnUy27iap6enPD09b+6AAQAAACCXOXzlLjcZY9SnTx99/fXXWr58uSpWrGi3vnbt2sqfP79iY2Otsl27dungwYMKCQmRJIWEhGjLli12o1rGxMTI29tbgYGBVp0r28isk9mGh4eHateubVcnIyNDsbGxVh0AAAAAyMtu+spdbujdu7dmz56tb775RkWKFLGekfPx8VHBggXl4+Oj7t27KzIyUsWLF5e3t7f69u2rkJAQNWjQQJLUvHlzBQYGqlOnTho3bpwSExM1bNgw9e7d27qy9uKLL2rSpEkaPHiwunXrpuXLl+vLL7/UokWLrFgiIyMVERGhOnXqqF69eho/frzOnj2rrl273vkTAwAAAAAOcngqhFzd+TXG658+fbq6dOki6fIk5gMHDtTnn3+u1NRUhYWFafLkyXa3Sx44cEC9evXSypUrVbhwYUVEROitt95Svnz/y11XrlypAQMGaPv27SpXrpz+9a9/WfvINGnSJL399ttKTExUcHCwJk6cqPr16+foWJgKIW9hKgQAAAA4i7Nygxwld7Vq1VJsbKyKFSum0aNH65VXXlGhQoXuRHx/GyR3eQvJHQAAAJwlT89zt2PHDp09e1aSNGrUKJ05c+a2BgUAAAAAcEyOnrkLDg5W165d9eCDD8oYo3feeUdeXl7Z1r3VKREAAAAAAI7L0W2Zu3bt0ogRI7R3715t3LhRgYGBds+zWY3ZbNq4ceNtCTSv47bMvIXbMgEAAOAsefqZuyu5ubkpMTFRpUqVul0x/S2R3OUtJHcAAABwFmflBg5PhZCRkXE74gAAAAAA3IKbmudu7969Gj9+vHbs2CFJCgwMVL9+/VSpUqVcDQ4AAAAAkDM5Gi3zSkuXLlVgYKDWr1+voKAgBQUFad26dapWrZpiYmJuR4wAAAAAgBtw+Jm7+++/X2FhYXrrrbfsyocOHaoffviBAVV45i5P4Jk7AAAAOEuenufuSjt27FD37t2zlHfr1k3bt2/PlaAAAAAAAI5xOLnz9fVVfHx8lvL4+HhG0AQAAAAAJ3F4QJUePXrohRde0L59+/TAAw9IktasWaOxY8cqMjIy1wMEAAAAANyYw8/cGWM0fvx4vfvuuzp8+LAkqWzZsho0aJBefvll2f6hD3vxzF3ewjN3AAAAcJa/zSTmVzp9+rQkqUiRIrkW0N8VyV3eQnIHAAAAZ/nbTGJ+JZI6AAAAAMgbHB5QBQAAAACQ95DcAQAAAIALILkDAAAAABfgUHJ38eJFNWvWTLt3775d8QAAAAAAboJDyV3+/Pm1efPm2xULAAAAAOAmOXxb5nPPPafPPvvsdsQCAAAAALhJDk+FcOnSJU2bNk3Lli1T7dq1VbhwYbv17733Xq4FBwAAAADIGYeTu61bt6pWrVqSpN9//91une2fPnM2AAAAADiJw8ndihUrbkccAAAAAIBbcNNTIezZs0dLly7V+fPnJUnGmFwLCgAAAADgGIeTuxMnTqhZs2a699571aJFCx05ckSS1L17dw0cODDXAwQAAAAA3JjDyd2AAQOUP39+HTx4UIUKFbLK27dvryVLluRqcAAAAACAnHH4mbsffvhBS5cuVbly5ezK77nnHh04cCDXAgMAAAAA5JzDV+7Onj1rd8Uu08mTJ+Xp6ZkrQQEAAAAAHONwcteoUSPNnDnTem2z2ZSRkaFx48bpoYceytXgAAAAAAA54/BtmePGjVOzZs3066+/Ki0tTYMHD9a2bdt08uRJrVmz5nbECAAAAAC4AYev3FWvXl2///67HnzwQbVq1Upnz55VmzZttGnTJlWqVOl2xAgAAAAAuAGbYYK6XJGSkiIfHx8lJyfL29vb2eHIZnN2BM7FpxoAAADO4qzcwOHbMiXp1KlT+uyzz7Rjxw5JUmBgoLp27arixYvnanAAAAAAgJxx+LbM1atXq0KFCpo4caJOnTqlU6dOaeLEiapYsaJWr159O2IEAAAAANyAw7dl1qhRQyEhIZoyZYrc3d0lSenp6XrppZe0du1abdmy5bYEmtdxW2bewm2ZAAAAcBZn5QYOX7nbs2ePBg4caCV2kuTu7q7IyEjt2bMnV4MDAAAAAOSMw8ldrVq1rGftrrRjxw7VrFkzV4ICAAAAADgmR8nd5s2breXll19Wv3799M477+inn37STz/9pHfeeUcDBgzQgAEDHNr56tWr9fjjj6ts2bKy2WxasGCB3fouXbrIZrPZLY8++qhdnZMnT6pjx47y9vZW0aJF1b17d505cyZL/I0aNVKBAgXk7++vcePGZYll7ty5qlKligoUKKAaNWro+++/d+hYAAAAAMCZcjRaZnBwsGw2m658PG/w4MFZ6j377LNq3759jnd+9uxZ1axZU926dVObNm2yrfPoo49q+vTp1mtPT0+79R07dtSRI0cUExOjixcvqmvXrnrhhRc0e/ZsSZfvd23evLlCQ0M1depUbdmyRd26dVPRokX1wgsvSJLWrl2rZ555RmPGjFHLli01e/ZstW7dWhs3blT16tVzfDwAAAAA4Cw5GlDlwIEDOW4wICDg5gKx2fT111+rdevWVlmXLl2UlJSU5Ypeph07digwMFC//PKL6tSpI0lasmSJWrRooT/++ENly5bVlClT9NprrykxMVEeHh6SpKFDh2rBggXauXOnJKl9+/Y6e/asFi5caLXdoEEDBQcHa+rUqdnuOzU1VampqdbrlJQU+fv7M6BKHsGAKgAAAHCWPD2gSkBAQI6X3LZy5UqVKlVK9913n3r16qUTJ05Y6+Li4lS0aFErsZOk0NBQubm5ad26dVadxo0bW4mdJIWFhWnXrl06deqUVSc0NNRuv2FhYYqLi7tmXGPGjJGPj4+1+Pv758rxAgAAAMDNuKlJzA8fPqyffvpJx44dU0ZGht26l19+OVcCky7fktmmTRtVrFhRe/fu1auvvqrHHntMcXFxcnd3V2JiokqVKmW3Tb58+VS8eHElJiZKkhITE1WxYkW7OqVLl7bWFStWTImJiVbZlXUy28hOVFSUIiMjrdeZV+4AAAAAwBkcTu6io6PVs2dPeXh4qESJErJdcf+fzWbL1eSuQ4cO1r9r1KihoKAgVapUSStXrlSzZs1ybT83w9PTM8vzfwAAAADgLA5PhfCvf/1Lw4cPV3Jysvbv36+EhARr2bdv3+2I0XL33XerZMmS1nx6fn5+OnbsmF2dS5cu6eTJk/Lz87PqHD161K5O5usb1clcDwAAAAB5ncPJ3blz59ShQwe5uTm86S37448/dOLECZUpU0aSFBISoqSkJG3YsMGqs3z5cmVkZKh+/fpWndWrV+vixYtWnZiYGN13330qVqyYVSc2NtZuXzExMQoJCbndhwQAAAAAucLhDK179+6aO3duruz8zJkzio+PV3x8vCQpISFB8fHxOnjwoM6cOaNBgwbp559/1v79+xUbG6tWrVqpcuXKCgsLkyRVrVpVjz76qHr06KH169drzZo16tOnjzp06KCyZctKujw9g4eHh7p3765t27bpiy++0IQJE+yel+vXr5+WLFmid999Vzt37tTIkSP166+/qk+fPrlynAAAAABwu+VoKoQrpaenq2XLljp//rxq1Kih/Pnz261/7733ctzWypUr9dBDD2Upj4iI0JQpU9S6dWtt2rRJSUlJKlu2rJo3b67XX3/dbvCTkydPqk+fPvruu+/k5uamtm3bauLEifLy8rLqbN68Wb1799Yvv/yikiVLqm/fvhoyZIjdPufOnathw4Zp//79uueeezRu3Di1aNEix8firOFOr4WpEJwdAQAAAP6pnJUbOJzcvfHGGxo+fLjuu+8+lS5dOsuAKsuXL8/1IP8OSO7yFpI7AAAAOIuzcgOHR8t89913NW3aNHXp0uU2hAMAAAAAuBkOP3Pn6emphg0b3o5YAAAAAAA3yeHkrl+/fvrggw9uRywAAAAAgJvk8G2Z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", "text/plain": [ "
" ] @@ -315,76 +267,118 @@ "source": [ "import matplotlib.pyplot as plt\n", "\n", - "layers = list(cycles_dict.keys())\n", - "cycles = list(cycles_dict.values())\n", "fig = plt.figure(figsize = (10, 5))\n", - "plt.bar(layers, cycles, color ='blue', width = 0.3)\n", - "plt.xlabel(\"Network Layers\")\n", - "plt.ylabel(\"Clock Cycles\")\n", - "plt.title(\"Estimated clock cycles for each network layer\")\n", + "plt.bar(cycles_dict.keys(), cycles_dict.values(), color ='blue', width = 0.3)\n", + "plt.xlabel(\"Network layers\")\n", + "plt.ylabel(\"Number of clock cycles\")\n", + "plt.title(\"Estimated no. of clock cycles for each network layer\")\n", "plt.show()" ] }, { - "cell_type": "code", - "execution_count": 8, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "res_dict = []\n", - "res_dict = res_estimation(model)" + "We observe that the bottleneck in the execution of the model on hardware would come from the execution of the first layer which takes estimated 38400 clock cycles to execute one set of its inputs.\n", + "\n", + "No matter how quickly the other layers execute, the throughput will be defined by the first layer's execution latency.\n", + "\n", + "Let's have a look now at the estimated resources per layer by calling another analysis pass.\n", + "The keys are again the layer names, but the values are now a dictionary with the resource estimates per layer." ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2YAAAHWCAYAAAAcgJqiAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAA9hAAAPYQGoP6dpAABeo0lEQVR4nO3deXxN1/7/8feRSEJGQRJDzFVCIkoRU7SGGKuXVqkSY1WjLb60dDC2TWe0F61W0Vuq5rYuVWOoeSw1U1NLUENiqJBk/f7wy76OBAlhG17Px+M8mrPW2nt/9jlnpd7Zw3EYY4wAAAAAALbJYXcBAAAAAPCgI5gBAAAAgM0IZgAAAABgM4IZAAAAANiMYAYAAAAANiOYAQAAAIDNCGYAAAAAYDOCGQAAAADYjGAGAAAAADYjmAG4KXXq1FGdOnXsLiNb7d+/Xw6HQ+PHj7e7FFvxOmTe+PHj5XA4tH///huO/fnnnxUeHi4PDw85HA6dPn36ttd3pzkcDvXo0cPuMu5qaZ+ZdevWZXnZJUuWyOFwaMmSJdlfGADbEcyA+0za//Sv9Vi1alWm17Vt2zYNGjQoU//ovJNGjRpla2hI+8fRtGnTrjnmev9AnTZtmvWPq7R1ZeaBe9eJEyfUqlUr5cqVSyNHjtR//vMfeXp62l3WfW/FihUaNGjQfRmCAdx/XO0uAMDtMWTIEBUvXjxde6lSpTK9jm3btmnw4MGqU6eOihUr5tT3yy+/3GqJN23UqFHKly+fOnToYFsN2aVs2bL6z3/+49TWv39/eXl56Y033rCpKmS3tWvX6syZMxo6dKjq1atndzkPjBUrVmjw4MHq0KGD/Pz87C4HAK6LYAbcpxo1aqTKlSvftvW7ubndtnU/SAIDA/Xcc885tb333nvKly9funbcu44dOyZJ2RoOzp07x1G3e8iFCxfu+9+bfCaBW8OpjMADbPLkyapUqZK8vb3l4+Oj0NBQjRgxQtLlUyKffvppSdJjjz1mnU6Xdm3D1deYpZ2SN2XKFA0ePFiFChWSt7e3nnrqKSUkJCgpKUk9e/ZUQECAvLy81LFjRyUlJTnVM27cOD3++OMKCAiQu7u7QkJCNHr0aKcxxYoV09atWxUXF2fVdGUdp0+fVs+ePRUcHCx3d3eVKlVK77//vlJTU53Wc/r0aXXo0EG+vr7y8/NTdHT0PXm609GjR+Xq6qrBgwen69u5c6ccDof+/e9/S5JOnjypPn36KDQ0VF5eXvLx8VGjRo3022+/3XA717qmsEOHDumOpqampmr48OEqV66cPDw8FBgYqG7duunUqVNO49atW6eoqCjly5dPuXLlUvHixdWpU6cb1uJwODRo0KB07cWKFXM6inrp0iUNHjxYDz30kDw8PJQ3b17VrFlT8+fPd1pux44deuqpp+Tv7y8PDw9VrlxZP/74Y7r1b926VY8//rhy5cqlwoUL6+233073ucpInTp1FB0dLUl69NFH5XA4nOqcOnWqKlWqpFy5clmB/K+//nJaR4cOHeTl5aW9e/eqcePG8vb2Vtu2ba+73b/++kudOnVSYGCg3N3dVa5cOX399ddOYy5evKgBAwaoUqVK8vX1laenp2rVqqXFixenW19qaqpGjBih0NBQeXh4KH/+/GrYsGGG10rNmjVL5cuXt7b7888/3/B1uvJ3yDvvvKPChQvLw8NDdevW1Z49e9KNX716tRo2bChfX1/lzp1bkZGRWr58udU/aNAg9e3bV5JUvHhx6/fF/v371aJFCz3yyCNO62vWrJkcDofTe7969Wo5HA7NnTvXavvjjz/09NNPy9/fX7lz51a1atX03//+N8N9mTx5st58800VKlRIuXPnVmJiYob7furUKVWpUkWFCxfWzp07b/haXWnZsmV6+umnVaRIEbm7uys4OFi9evXSP//8Y40ZN26cHA6HNm7cmG75d999Vy4uLk6fuRu9ttLl19fhcGjbtm169tlnlSdPHtWsWTNLtQNwxhEz4D6VkJCgv//+26nN4XAob968kqT58+erTZs2qlu3rt5//31J0vbt27V8+XK98sorql27tl5++WV9+umnev3111W2bFlJsv57LbGxscqVK5f69eunPXv26LPPPlPOnDmVI0cOnTp1SoMGDdKqVas0fvx4FS9eXAMGDLCWHT16tMqVK6cnnnhCrq6u+umnn/Tiiy8qNTVVMTExkqThw4frpZdecjrVLzAwUJJ0/vx5RUZG6q+//lK3bt1UpEgRrVixQv3799eRI0c0fPhwSZIxRs2bN9evv/6qF154QWXLltXMmTOtfzzfSwIDAxUZGakpU6Zo4MCBTn3ff/+9XFxcrID9xx9/aNasWXr66adVvHhxHT16VF988YUiIyO1bds2FSxYMFtq6tatm8aPH6+OHTvq5Zdf1r59+/Tvf/9bGzdu1PLly5UzZ04dO3ZMDRo0UP78+dWvXz/5+flp//79mjFjRrbUIF3+h2NsbKy6dOmiKlWqKDExUevWrdOGDRtUv359SZfDVo0aNVSoUCH169dPnp6emjJlip588klNnz5d//rXvyRJ8fHxeuyxx5ScnGyNGzNmjHLlynXDOt544w09/PDDGjNmjHWKccmSJSXJep0effRRxcbG6ujRoxoxYoSWL1+ujRs3Oh1hS05OVlRUlGrWrKmPPvpIuXPnvuY2jx49qmrVqlnXOubPn19z585V586dlZiYqJ49e0qSEhMT9dVXX6lNmzbq2rWrzpw5o7FjxyoqKkpr1qxReHi4tc7OnTtr/PjxatSokbp06aLk5GQtW7ZMq1atcjo6/+uvv2rGjBl68cUX5e3trU8//VQtW7bUwYMHrd8/1/Pee+8pR44c6tOnjxISEvTBBx+obdu2Wr16tTVm0aJFatSokSpVqqSBAwcqR44c1h92li1bpipVqqhFixbatWuXvvvuOw0bNkz58uWTJOXPn1+1atXSDz/8oMTERPn4+MgYo+XLlytHjhxatmyZnnjiCUmXQ0+OHDlUo0YN63WtXr26zp8/r5dffll58+bVhAkT9MQTT2jatGnW5yXN0KFD5ebmpj59+igpKSnDI2Z///236tevr5MnTyouLs76bGTW1KlTdf78eXXv3l158+bVmjVr9Nlnn+nPP//U1KlTJUlPPfWUYmJiNHHiRFWsWNFp+YkTJ6pOnToqVKhQpl/bKz399NN66KGH9O6778oYk6XaAVzFALivjBs3zkjK8OHu7m6Ne+WVV4yPj49JTk6+5rqmTp1qJJnFixen64uMjDSRkZHW88WLFxtJpnz58ubixYtWe5s2bYzD4TCNGjVyWj4iIsIULVrUqe38+fPpthMVFWVKlCjh1FauXDmnbacZOnSo8fT0NLt27XJq79evn3FxcTEHDx40xhgza9YsI8l88MEH1pjk5GRTq1YtI8mMGzcu3bqvlLavU6dOveYYSSYmJibDvuu9rtfbv2v54osvjCSzZcsWp/aQkBDz+OOPW88vXLhgUlJSnMbs27fPuLu7myFDhji1Xf06XP1+p4mOjnZ6H5ctW2YkmYkTJzqN+/nnn53aZ86caSSZtWvXZno/00gyAwcOTNdetGhREx0dbT2vUKGCadKkyXXXVbduXRMaGmouXLhgtaWmpprq1aubhx56yGrr2bOnkWRWr15ttR07dsz4+voaSWbfvn3X3U7avLxyfy9evGgCAgJM+fLlzT///GO1z54920gyAwYMsNqio6ONJNOvX7/rbidN586dTYECBczff//t1N66dWvj6+trzbXk5GSTlJTkNObUqVMmMDDQdOrUyWpbtGiRkWRefvnldNtKTU21fpZk3NzczJ49e6y23377zUgyn3322XVrTptXZcuWdappxIgRTp/v1NRU89BDD5moqCinbZ8/f94UL17c1K9f32r78MMPM3x/1q5daySZOXPmGGOM2bx5s5Fknn76aVO1alVr3BNPPGEqVqxoPU/7HCxbtsxqO3PmjClevLgpVqyYNb/S9qVEiRLpfq9d+Vk4cuSIKVeunClRooTZv3//dV+fK9d75e+OjH5vxsbGGofDYQ4cOGC1tWnTxhQsWNDpd8CGDRuc5npWXtuBAwcaSaZNmzY3rBtA5nAqI3CfGjlypObPn+/0uPJ0HD8/P507dy7daV23qn379sqZM6f1vGrVqjLGpDtFrWrVqjp06JCSk5OttiuPPqQd8YuMjNQff/yhhISEG2576tSpqlWrlvLkyaO///7betSrV08pKSlaunSpJGnOnDlydXVV9+7drWVdXFz00ksv3fR+26lFixZydXXV999/b7X9/vvv2rZtm5555hmrzd3dXTlyXP61n5KSohMnTsjLy0sPP/ywNmzYkC21TJ06Vb6+vqpfv77Te1CpUiV5eXlZp8ilHQmaPXu2Ll26lC3bvpqfn5+2bt2q3bt3Z9h/8uRJLVq0SK1atdKZM2esWk+cOKGoqCjt3r3bOr1rzpw5qlatmtPRgvz589/wdMLrWbdunY4dO6YXX3xRHh4eVnuTJk1UpkyZdKfHSXL6zF6LMUbTp09Xs2bNZIxxeh+ioqKUkJBgvd8uLi7WUZzU1FSdPHlSycnJqly5stNnYvr06XI4HOmOykpKd8fQevXqOR31CQsLk4+Pj/74448b1i5JHTt2dDqyVKtWLUmylt+0aZN2796tZ599VidOnLD27dy5c6pbt66WLl16w1NMK1asKC8vL+t3wrJly1S4cGG1b99eGzZs0Pnz52WM0a+//mptX7r8OahSpYrTKXteXl56/vnntX//fm3bts1p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Jk1uar0uLi5q2bKlpk+frt9//z1d/5X7ldG8W716tVauXOm0TMuWLWWMyfBrGTJ7JCy7VKpUSSVLltRHH32ks2fPpuu/cv+u9zusatWqypkzp95//335+/urXLlyki4HtlWrVikuLi7d0bLGjRtrzZo1Tq/PuXPnNGbMGBUrVkwhISFZ2pe33npLffr0Uf/+/dN9NUhmZPT+GWOsrz25WlhYmMLCwvTVV19p+vTpat26tVxd//c3+qy8tgCyH0fMgPvU3Llzrb/iXql69eoqUaKEunTpopMnT+rxxx9X4cKFdeDAAX322WcKDw+3rpcIDw+Xi4uL3n//fSUkJMjd3d36nrHs1qBBA+sIXrdu3XT27Fl9+eWXCggISPeP5kqVKmn06NF6++23VapUKQUEBOjxxx9X37599eOPP6pp06bq0KGDKlWqpHPnzmnLli2aNm2a9u/fr3z58qlZs2aqUaOG+vXrp/379yskJEQzZszI1A1GrjR9+vQMX+Po6Gj169dPU6dOVe3atdWtWzeVKVNGhw8f1vjx43XkyJEMA+eteuaZZ/Tcc89p1KhRioqKSvdlxk2bNtWQIUPUsWNHVa9eXVu2bNHEiROtI0fX06lTJ33yySeKiopS586ddezYMX3++ecqV66c03czRUZGqlu3boqNjdWmTZvUoEED5cyZU7t379bUqVM1YsQIPfXUU5owYYJGjRqlf/3rXypZsqTOnDmjL7/8Uj4+PmrcuPF1a+nSpYteeOEFtWzZUvXr19dvv/2mefPmpTvqFxISojp16qhSpUry9/fXunXrNG3aNPXo0cMaM3LkSNWsWVOhoaHq2rWrSpQooaNHj2rlypX6888/re94e/XVV/Wf//xHDRs21CuvvGLdLr9o0aLavHnzDV+/jKSFgo4dOyoyMlJt2rSxbpdfrFgx9erV66bWK12+5fzixYtVtWpVde3aVSEhITp58qQ2bNigBQsW6OTJk5IufyZmzJihf/3rX2rSpIn27dunzz//XCEhIU7/MH/sscfUrl07ffrpp9q9e7caNmyo1NRULVu2TI899pjTa3q75ciRQ1999ZUaNWqkcuXKqWPHjipUqJD++usvLV68WD4+Pvrpp58kXf5dIV3+yoLWrVsrZ86catasmTw9PZU7d25VqlRJq1atsr7DTLp8xOzcuXM6d+5cumDWr18/fffd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", "text/plain": [ - "
" + "{'MatrixVectorActivation_0': {'BRAM_18K': 5,\n", + " 'BRAM_efficiency': 0.8333333333333334,\n", + " 'LUT': 319,\n", + " 'URAM': 0,\n", + " 'URAM_efficiency': 1,\n", + " 'DSP': 0},\n", + " 'MatrixVectorActivation_1': {'BRAM_18K': 1,\n", + " 'BRAM_efficiency': 0.4444444444444444,\n", + " 'LUT': 320,\n", + " 'URAM': 0,\n", + " 'URAM_efficiency': 1,\n", + " 'DSP': 0},\n", + " 'MatrixVectorActivation_2': {'BRAM_18K': 1,\n", + " 'BRAM_efficiency': 0.4444444444444444,\n", + " 'LUT': 320,\n", + " 'URAM': 0,\n", + " 'URAM_efficiency': 1,\n", + " 'DSP': 0},\n", + " 'MatrixVectorActivation_3': {'BRAM_18K': 1,\n", + " 'BRAM_efficiency': 0.006944444444444444,\n", + " 'LUT': 320,\n", + " 'URAM': 0,\n", + " 'URAM_efficiency': 1,\n", + " 'DSP': 0}}" ] }, + "execution_count": 8, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ - "layers = list(res_dict.keys())\n", - "utilisation = list(res_dict.values())\n", - "lut_values = [] #Initializing a list to store LUT values.\n", - "for i in range(len(layers)):\n", - " x = list(utilisation[i].values()) #Extracting the resource utilisation for each layer as a list.\n", - " lut_values.append(x[2]) #Extracting the LUT values of resource utilisation from each layer and appending to the list\n", - " \n", - "#Plotting the bar graph of each network layer with their corresponding LUT resource utilisation\n", - "fig = plt.figure(figsize = (10, 5))\n", - "plt.bar(layers, lut_values, color ='green', width = 0.3)\n", - "plt.xlabel(\"Network Layers\")\n", - "plt.ylabel(\"LUT Utilisation\")\n", - "plt.title(\"Estimated LUT values used for each network layer\")\n", - "plt.show()" + "res_dict = model.analysis(res_estimation)\n", + "res_dict" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Note, from the above result we observe that the bottleneck in the execution of the model on hardware would come from the execution of the first layer which takes estimated 38400 clock cycles to execute one set of its inputs.\n", - "No matter how quickly the layers execute the (throughput or latency?) will be defined by the first layer's execution latency.\n", + "Next to the absolute numbers of LUTs, BRAM, URAM and DSPs, the analysis pass also provides information about the efficiency of the memory usage. If the memory type is not utilized, the efficiency is by default 1. You can see that above for the `URAM_efficiency`. In all other cases the efficiency indicates the actual parameter storage needed divided by the allocated BRAM/URAM storage. So, this means in our example MVAU_0 uses 5 block ram and they are 83% utilized. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After we extract that information from the model, we plot the number of LUTs. In this notebook we concentrate on the influence on the LUT usage, but by manipulating the code below, you can also extract information about memory and dsp usage." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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cOBADRo0SA0aNFD37t21a9cujR07Vhs2bNDq1auVO3dul/a5fft2hYeHy9fXV6+88opy586tzz//XPXr19eKFStUs2ZNtWzZUv7+/urdu7fatm2rJk2a3PaEA3fDrT57WaFVq1bavn27evbsqVKlSun48eNatGiRDh48aIXUr776StHR0YqMjNTQoUN14cIFjR07VnXq1NHmzZutfgsXLlSrVq0UEhKiIUOG6OTJk1bou5WvvvpK//d//6f169fryy+/lCQ99thjkqR//etfmjRpkv75z3+qb9++WrdunYYMGaK4uLh0wW/Xrl1q27atnn/+eXXt2jXdL9PXWrp0qRo3bqzq1atrwIABcnNzs36BX7VqlR599FFJ0oYNG7RmzRq1adNGJUqU0IEDBzR27FjVr19fO3bssM5+nDt3TuHh4YqLi1Pnzp1VrVo1/fXXX/r+++91+PBhFSpUyNr3+++/Lzc3N7388stKTEzUsGHD1K5dO61bty5T71vr1q1VunRpDRkyRJs2bdKXX36pIkWKWJ8TSXr33Xf15ptvqnXr1vrXv/6lEydOaNSoUapbt642b94sf39//ec//1FiYqLTJbTe3t5yOByqXbu2Vq5caW1vy5YtSkxMlJubm1avXq2oqChJ0qpVq/Twww9bY2fx4sVq3LixypQpo4EDB+rixYsaNWqUateurU2bNqX748fTTz+tBx98UO+9956MMRke74YNGxQZGakaNWpozpw5Lp8FzczPzPbt22vy5MlasGCB032i8fHxWrp0qQYMGODSa5vm5MmTaty4sdq0aaPnnnvO+jkM4DYZAPedCRMmGEkZPjw9Pa1+L730kvH19TVXrly54ba+++47I8ksW7Ys3bJ69eqZevXqWc+XLVtmJJlKlSqZy5cvW+1t27Y1DofDNG7c2Gn9sLAwExQU5NR24cKFdPuJjIw0ZcqUcWqrWLGi077TvP3228bLy8vs3r3bqf21114z7u7u5uDBg8YYY2bPnm0kmWHDhll9rly5YsLDw40kM2HChHTbvlbaa9ygQQOTmppqtffu3du4u7ubhIQEY4wxx48fNx4eHqZhw4YmJSXF6vfpp58aSWb8+PE33U9GWrRoYTw8PMy+ffustiNHjhgfHx9Tt25dq23//v1Gkvnggw9uuc3M9A0KCjJRUVEZLtuwYcNNX7eoqCin9zozn72MpH3Grv88ptWftv/Tp0/f8njOnj1r/P39TdeuXZ3a4+PjjZ+fn1N7aGioKVasmPW+GmPMwoULjaR0n+GMREdHGy8vL6e22NhYI8n861//cmp/+eWXjSSzdOlSqy0oKMhIMvPnz7/lvlJTU82DDz5oIiMjnT6bFy5cMKVLlzZPPvmkU9v11q5daySZyZMnW21vvfWWkWRmzpyZ4f6M+d97U6FCBZOUlGQt/+STT4wks3Xr1pvWPWDAACPJdO7c2an9H//4hylYsKD1/MCBA8bd3d28++67Tv22bt1qcuXK5dR+/ecuzQcffGDc3d3NmTNnjDHGjBw50gQFBZlHH33UvPrqq8YYY1JSUoy/v7/p3bu3tV5oaKgpUqSIOXnypNX222+/GTc3N9OhQ4d0x9K2bdt0+772s/Dzzz8bX19fExUVZS5dunTT1+fa7V4rMz8zU1JSTIkSJcwzzzzj1O/jjz82DofD/P7778YY117bevXqGUnms88+u2XdADKHSxmB+9jo0aO1aNEip8e8efOs5f7+/jp//rwWLVqUpfvt0KGD01mgmjVryhijzp07O/WrWbOmDh06pCtXrlht1/61OO2MX7169fT7778rMTHxlvv+7rvvFB4ervz58+uvv/6yHg0aNFBKSor1V/KffvpJuXLlUvfu3a113d3d1bNnT5eOtVu3bk7TV4eHhyslJUV//PGHpKt/Yb98+bJ69eolN7f//cjt2rWrfH199eOPP7q0v5SUFC1cuFAtWrRQmTJlrPZixYrp2Wef1c8//6wzZ864tE073K3PXpq0+7mWL1+u06dPZ9hn0aJFSkhIUNu2bZ0+K+7u7qpZs6aWLVsmSTp69KhiY2MVHR0tPz8/a/0nn3xSISEht13jTz/9JElOl9RJUt++fSUp3WejdOnSioyMvOV2Y2NjtWfPHj377LM6efKkdVznz59XRESEVq5caV3We+14S05O1smTJ1W2bFn5+/tr06ZN1rIZM2aoatWq+sc//pFuf9dP396pUyene+nCw8MlSb///vsta5ekf//7307Pw8PDdfLkSetzPXPmTKWmpqp169ZO71tAQIAefPBB6327mbRxumbNGklXz4yFh4crPDxcq1atkiRt27ZNCQkJVv1pn4OOHTuqQIEC1raqVKmiJ5980no/b3Ys11q2bJkiIyMVERGhmTNnytPT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5513VLZsWRUpUkRPPPGE+vXrp++//15NmzZVx44dVb16dZ0/f15bt27V9OnTdeDAARUqVEjNmjVT7dq19dprr+nAgQMKCQnRzJkzMzXBiCsKFy6s/v37a9CgQWrUqJGeeuop7dq1S2PGjNEjjzzi9ItRhw4dtGLFilv+ovvOO+9o0aJFqlOnjl544QXlypVLn3/+uZKSkjRs2LA7qnfJkiXpAo0ktWjRQt26ddP48eP19NNPq3Pnznr44Yd18uRJffPNN9q2bZsmT56c6ftNMvPZy4ifn5+efvppjRo1Sg6HQ8HBwZo7d65172Ca3bt3KyIiQq1bt1ZISIhy5cqlWbNm6dixY2rTpo2kq2eUxo4dq/bt26tatWpq06aNChcurIMHD+rHH39U7dq19emnn0q6+hUQUVFRqlOnjjp37qxTp05p1KhRqlixosvfO5WmatWqio6O1v/93/8pISFB9erV0/r16zVp0iS1aNFCjz/++G1t183NTV9++aUaN26sihUrqlOnTnrggQf0559/atmyZfL19dUPP/wgSWratKm++uor+fn5KSQkRGvXrtXixYutez7T9OvXT9OnT7fe++rVq+vUqVP6/vvv9dlnn6lq1aq3VevtCA4O1jvvvKP+/fvrwIEDatGihXx8fLR//37NmjVL3bp108svvyzp6s+Jb775Rn369NEjjzwib29vNWvWTJIUFhamXLlyadeuXerWrZu1/bp161p/sLk2mElXLw9t3LixwsLC1KVLF2u6fD8/Pw0cONDlY8mbN6/mzp2rJ554Qo0bN9aKFStUqVKlTK/vys9M6erPo0aNGum7776Tv79/uvDvymsL4C64t5NAArgXbjZdvq6ZUnz69OmmYcOGpkiRIsbDw8OULFnSPP/88+bo0aNO2/viiy9MmTJljLu7u9NU5TeaLv+7777LsJ4NGzY4tadN/XzixAmr7fvvvzdVqlQxefLkMaVKlTJDhw4148ePN5LM/v37rX7x8fEmKirK+Pj4GElOdZw9e9b079/flC1b1nh4eJhChQqZxx57zHz44YdO0/ifPHnStG/f3vj6+ho/Pz/Tvn17s3nzZpemy7/+mG40nfunn35qypcvb3Lnzm2KFi1qunfvbk6fPu3UJ2366czYtGmTiYyMNN7e3iZfvnzm8ccfN2vWrHHqczvT5d/o8dVXXxljrk5D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wIEKDQ3Vl19+qdKlSytPnjwZ1vrjjz/Kz89PU6ZMydRrcPLkSbVt21YPPPCA8uXLp8qVK+vrr7+2lk+ePFkFCxZUUlKS03otWrRQ+/btredz5sxRtWrVlCdPHpUpU0aDBg3SlStXrOUOh0Njx47VU089JS8vL7377rs6ffq02rVrp8KFCytv3rx68MEHNWHChEzVDQDIHghmAIA75u7urvfee0+jRo3S4cOHM+yzb98+NWrUSK1atdKWLVv0zTff6Oeff1aPHj0kSTNnzlSJEiU0ePBgHT16VEePHpXD4VDdunW1fPlySdLp06cVFxenixcvaufOnZKkFStW6JFHHlG+fPmUmpqq5s2b69SpU1qxYoUWLVqk33//Xc8884xTLXv37tWMGTM0c+ZMxcbGpqt16tSpatu2raZMmaJ27dpl6jW4dOmSqlevrh9//FHbtm1Tt27d1L59e61fv16S9PTTTyslJUXff/+9tc7x48f1448/qnPnzpKkVatWqUOHDnrppZe0Y8cOff7555o4caLeffddp30NHDhQ//jHP7R161Z17txZb775pnbs2KF58+YpLi5OY8eOVaFChTJVNwAgmzAAANyB6Oho07x5c2OMMbVq1TKdO3c2xhgza9Ysc+3/Zrp06WK6devmtO6qVauMm5ubuXjxojHGmKCgIDN8+HCnPiNHjjQVK1Y0xhgze/ZsU7NmTdO8eXMzduxYY4wxDRo0MK+//roxxpiFCxcad3d3c/DgQWv97du3G0lm/fr1xhhjBgwYYHLnzm2OHz/utJ969eqZl156yXz66afGz8/PLF++/KbHvWzZMiPJnD59+oZ9oqKiTN++fa3n3bt3N40bN7aef/TRR6ZMmTImNTXVGGNMRESEee+995y28dVXX5lixYpZzyWZXr16OfVp1qyZ6dSp003rBQBkb5wxAwBkmaFDh2rSpEmKi4tLt+y3337TxIkT5e3tbT0iIyOVmpqq/fv333Cb9erV044dO3TixAmtWLFC9evXV/369bV8+XIlJydrzZo1ql+/viQpLi5OgYGBCgwMtNYPCQmRv7+/U01BQUEqXLhwun1Nnz5dvXv31qJFi1SvXj2Xjj0lJUVvv/22KleurAIFCsjb21sLFizQwYMHrT5du3bVwoUL9eeff0qSJk6caE2ekvYaDR482Ok16tq1q44ePWpdqilJNWrUcNp39+7dNW3aNIWGhuqVV17RmjVrXKodAGA/ghkAIMvUrVtXkZGR6t+/f7pl586d0/PPP6/Y2Fjr8dtvv2nPnj0KDg6+4TbTgs6KFSucgtmKFSu0YcMGJScn67HHHnOpTi8vrwzbH374YRUuXFjjx4+XMcalbX7wwQf65JNP9Oqrr2rZsmWKjY1VZGSk0+QiDz/8sKpWrarJkydr48aN2r59uzp27GgtP3funAYNGuT0Gm3dulV79uxxuhfu+vobN25s3Z935MgRRURE6OWXX3apfgCAvXLZXQAA4P7y/vvvKzQ0VOXKlXNqr1atmnbs2KGyZcvecF0PDw+lpKQ4tTkcDoWHh2vOnDnavn276tSpo3z58ikpKUmff/65atSoYQWVChUq6NChQzp06JB11mzHjh1KSEhQSEjILWsPDg7WRx99pPr168vd3V2ffvpppo979erVat68uZ577jlJUmpqqnbv3p1uv//61780YsQI/fnnn2rQoIHT2b1q1app165dN32NbqRw4cKKjo5WdHS0wsPD1a9fP3344YcubwcAYA/OmAEAslTlypXVrl07jRw50qn91Vdf1Zo1a9SjRw/FxsZqz549mjNnjjX5h3T1e8xWrlypP//8U3/99ZfVXr9+fX399dcKDQ2Vt7e33NzcVLduXU2ZMsXpksMGDRpY+9+0aZPWr1+vDh06qF69euku/7uRhx56SMuWLdOMGTNc+sLpBx98UIsWLdKaNWsUFxen559/3mk2yDTPPvusDh8+rC+++MKa9CPNW2+9pcmTJ2vQoEHavn274uLiNG3aNL3xxhs33fdbb72lOXPmaO/evdq+fbvmzp2rChUqZLp2AID9CGYAgCw3ePBgpaamOrVVqVJFK1as0O7duxUeHq6HH35Yb731looXL+603oEDBxQcHOx0D1i9evWUkpJi3UsmXQ1r17c5HA7NmTNH+fPnV926ddWgQQOVKVNG33zzjUv1lytXTkuXLtXXX3+tvn37ZmqdN954Q9WqVVNkZKTq16+vgIAAtWjRIl0/Pz8/tWrVSt7e3umWR0ZGau7cuVq4cKEeeeQR1apVS8OHD1dQUNBN9+3h4aH+/furSpUqqlu3rtzd3TVt2rTMHi4AIBtwGFcvogcAAHckIiJCFStWTHdWEQCQcxHMAAC4R06fPq3ly5frn//8p3bs2JHuPjwAQM7F5B8AANwjDz/8sE6fPq2hQ4cSygAATjhjBgAAAAA2Y/IPAAAAALAZwQwAAAAAbEYwAwAAAACbEcwAAAAAwGYEMwAAAACwGcEMAAAAAGxGMAMAAAAAmxHMAAAAAMBm/w/0qOvg3rATgQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Extracting LUTs from res_dict\n", + "LUTs = [res_dict[key][\"LUT\"] for key in res_dict.keys()] \n", "\n", - "So our goal to adjust the folding parameters would be to expand the computation of the first layer to reduce its latency at the expense an of increase in resource utilization." + "#Plotting the bar graph of each network layer with their corresponding LUT resource utilization\n", + "fig = plt.figure(figsize = (10, 5))\n", + "plt.bar(res_dict.keys(), LUTs, color ='green', width = 0.3)\n", + "plt.xlabel(\"Network layers\")\n", + "plt.ylabel(\"Number of LUTs\")\n", + "plt.title(\"Estimated no. of LUTs used for each network layer\")\n", + "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "
\n", - "Question in the first line of the above cell.\n", - "
" + "Since we identified above that the first layer takes the highest number of cycles to complete the execution, we will now try to adjust the folding parameters to reduce its latency at the expense of an increase in resource utilization." ] }, { @@ -1931,7 +1925,12 @@ "source": [ "## Modify Parameters\n", "\n", - "We now modify the parallelization attributes of the first network layer to reduce its overall latency." + "We now modify the parallelization attributes of the first network layer to reduce its overall latency.\n", + "We now individually extract the `MatrixVectorActivation` blocks from the onnx file and set the config values manually (although this can be done automatically by Vivado tools also as mentioned in the introduction).\n", + "\n", + "In the first step, we set the `PE` & `SIMD` values for all the layers to be '1' to establish a baseline and measure the estimated clock cycles and resource utilization for each of the individual layers.\n", + "\n", + "We utilize from (`getCustomOp()`) as the helper function to set different properties of the node. The (`set_nodeattr()`) function within this function call helps us set these values." ] }, { @@ -2061,8 +2060,8 @@ "metadata": {}, "outputs": [], "source": [ - "res_dict_updated = []\n", - "res_dict_updated = res_estimation(model)" + "res_dict_updated = model.analysis(res_estimation)\n", + "res_dict_updated" ] }, { @@ -2082,16 +2081,12 @@ } ], "source": [ - "layers_updated = list(res_dict_updated.keys())\n", - "utilisation_updated = list(res_dict_updated.values())\n", - "lut_values_updated = [] #Initializing a list to store LUT values.\n", - "for i in range(len(layers_updated)):\n", - " x = list(utilisation_updated[i].values()) #Extracting the resource utilisation for each layer.\n", - " lut_values_updated.append(x[2]) #Extracting the LUT values of resource utilisation from each layer and appending to the list\n", + "# Extracting LUTs from res_dict\n", + "LUTs_updated = [res_dict[key][\"LUT\"] for key in res_dict_updated.keys()] \n", "\n", - "#Plotting the bar graph of each network layer with their corresponding LUT resource utilisation\n", + "#Plotting the bar graph of each network layer with their corresponding LUT resource utilization\n", "fig = plt.figure(figsize = (10, 5))\n", - "plt.bar(layers_updated, lut_values_updated, color ='green', width = 0.3)\n", + "plt.bar(res_dict_updated.keys(), LUTs_updated, color ='green', width = 0.3)\n", "plt.xlabel(\"Network Layers\")\n", "plt.ylabel(\"LUT Utilisation\")\n", "plt.title(\"Estimated LUT values used for each network layer\")\n", diff --git a/notebooks/advanced/finn-dataflow.png b/notebooks/advanced/finn-dataflow.png new file mode 100755 index 0000000000..ebe98d0fbd Binary files /dev/null and b/notebooks/advanced/finn-dataflow.png differ diff --git a/notebooks/advanced/finn-folding-mvau.png b/notebooks/advanced/finn-folding-mvau.png new file mode 100755 index 0000000000..bbba00182c Binary files /dev/null and b/notebooks/advanced/finn-folding-mvau.png differ diff --git a/notebooks/advanced/finn-folding.png b/notebooks/advanced/finn-folding.png new file mode 100755 index 0000000000..019b4aa1e7 Binary files /dev/null and b/notebooks/advanced/finn-folding.png differ diff --git a/notebooks/advanced/finn-hw-arch.png b/notebooks/advanced/finn-hw-arch.png deleted file mode 100644 index e5631ab97d..0000000000 Binary files a/notebooks/advanced/finn-hw-arch.png and /dev/null differ