tachibana/test_bench/term_renderer_analysis.ipynb
2021-06-17 19:16:34 +02:00

182 lines
18 KiB
Text

{
"cells": [
{
"cell_type": "code",
"execution_count": 70,
"id": "exact-wallpaper",
"metadata": {},
"outputs": [],
"source": [
"import re\n",
"import contextlib\n",
"\n",
"from PIL import Image\n",
"import numpy as np\n",
"from matplotlib import pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 72,
"id": "broke-detection",
"metadata": {},
"outputs": [],
"source": [
"TC_BODY = '''\n",
"testcase_id = {tc_id};\n",
"\n",
"rst = 1;\n",
"clk = 0;\n",
"repeat(2) @(posedge clk);\n",
"rst = 0;\n",
"repeat(8) @(posedge clk);\n",
"\n",
"@(posedge clk) vsync = 1;\n",
"for (integer y=0; y<{h}; y=y+1) begin\n",
" for (integer x=0; x<{w}; x=x+1) begin\n",
" @(posedge clk) hsync = 1;\n",
" end\n",
" repeat(5) @(posedge clk) hsync = 0;\n",
"end\n",
"repeat(100) @(posedge clk) vsync = 0;\n",
"\n",
"$writememh(\"test_term_fb_dump_{tc_id}.hex\", data_recording, 0, ({w}+5) * {h} + 100);\n",
"'''\n",
"\n",
"TESTCASES = [\n",
" (32, 32),\n",
" (100, 20),\n",
" (97, 97)\n",
"]\n",
"\n",
"def write_testcases():\n",
" with open('test_data/00TERM_RENDERER_TC_IDX.v', 'w') as f, contextlib.redirect_stdout(f):\n",
" for tc_id, (w, h) in enumerate(TESTCASES):\n",
" print(TC_BODY.format(tc_id=tc_id, w=w, h=h))\n",
" \n",
"write_testcases()"
]
},
{
"cell_type": "code",
"execution_count": 66,
"id": "synthetic-victim",
"metadata": {},
"outputs": [],
"source": [
"def read_hexfile(filename):\n",
" with open(filename) as f:\n",
" gen = ((int(line, 16) if re.match(r'^[0-9a-f]+$', line) else 0) for line in f if line.strip())\n",
" return np.array([ ((p>>16)&0xff, (p>>8)&0xff, p&0xff) for p in gen ])[:-1]\n",
"\n",
"def display_image(filename, w, h):\n",
" w_blanked = w+5\n",
" img = read_hexfile(filename).astype(np.uint8)[8+1:][:h*w_blanked].reshape((h, w_blanked, 3))\n",
" fig, ax = plt.subplots()\n",
" ax.imshow(img, interpolation='None')"
]
},
{
"cell_type": "code",
"execution_count": 75,
"id": "protective-corps",
"metadata": {},
"outputs": [],
"source": [
"def show_tc(tc_id):\n",
" w, h = TESTCASES[tc_id]\n",
" display_image(f'../Artix-7-HDMI-processing.sim/sim_1/behav/xsim/test_term_fb_dump_{tc_id}.hex', w, h)"
]
},
{
"cell_type": "code",
"execution_count": 76,
"id": "numerical-husband",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"show_tc(0)"
]
},
{
"cell_type": "code",
"execution_count": 78,
"id": "regional-control",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"show_tc(1)"
]
},
{
"cell_type": "code",
"execution_count": 79,
"id": "wired-albany",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"show_tc(2)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.2"
}
},
"nbformat": 4,
"nbformat_minor": 5
}