... but super unstable. It looks as if pixel data gets subtly corrupted when output over HDMI. To-Do: * Check whether broken output persists on Windows and is not linux-only * Check whether output is still broken if software rendering/window compositing is used * Maybe check on an apple platform? * Research this behavior
267 lines
33 KiB
Text
267 lines
33 KiB
Text
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 121,
|
|
"id": "martial-democrat",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import re\n",
|
|
"import contextlib\n",
|
|
"import itertools\n",
|
|
"import string\n",
|
|
"\n",
|
|
"from PIL import Image\n",
|
|
"import numpy as np\n",
|
|
"from matplotlib import pyplot as plt"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 94,
|
|
"id": "flexible-synthetic",
|
|
"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",
|
|
" (92, 97),\n",
|
|
" (400, 400),\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": 185,
|
|
"id": "fifteen-swimming",
|
|
"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, **kwargs):\n",
|
|
" w_blanked = w+5\n",
|
|
" img = read_hexfile(filename).astype(np.uint8)[8+1:][:h*w_blanked].reshape((h, w_blanked, 3))[:,:w,:]\n",
|
|
" #fig, ax = plt.subplots(**kwargs)\n",
|
|
" #ax.imshow(img, interpolation='None')\n",
|
|
" return Image.fromarray(img)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 111,
|
|
"id": "excessive-permit",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def show_tc(tc_id, **kwargs):\n",
|
|
" w, h = TESTCASES[tc_id]\n",
|
|
" return display_image(f'../Artix-7-HDMI-processing.sim/sim_1/behav/xsim/test_term_fb_dump_{tc_id}.hex', w, h, **kwargs)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 192,
|
|
"id": "cathedral-information",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def write_glyph_buffer_init_file(fn):\n",
|
|
" with open(fn, 'w') as f:\n",
|
|
" for row in range(128):\n",
|
|
" for col, c in enumerate(itertools.islice(itertools.cycle(string.printable), row, row+256)):\n",
|
|
" if col == row+30:\n",
|
|
" c = '\\n'\n",
|
|
" underline = bool(row&1)\n",
|
|
" bold = bool(row&2)\n",
|
|
" bgcolor = max(0, col%24-8) if col//24%2 == 1 else 0\n",
|
|
" fgcolor = 0 if col//24%2 == 1 and col%24 > 8 else (7 if col%24<8 else col%24-8)\n",
|
|
" code = (int(underline)<<19) | (int(bold)<<18) | (bgcolor<<12) | (fgcolor<<8) | ord(c)\n",
|
|
" print(f'{code:05x}', file=f)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 193,
|
|
"id": "available-being",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"write_glyph_buffer_init_file('test_data/test_glyphmem_data.hex')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 198,
|
|
"id": "hollow-husband",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"write_glyph_buffer_init_file(f'../src/gen/glyph_buffer_init_file.hex')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 172,
|
|
"id": "selective-pepper",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAACUAAAAgCAIAAAAaMSbnAAAA90lEQVR4nO1WwQ3DMAh0Ks+TVwfoKtmiUt6RskVX7SMSohgumLpIrcrLIZgDzgZP8/VWEuWSCVZKqfxj2VdaP+6bMF32VSgte+CnciOxx3KB7bEfVz3bzMKi44lsVDArAhxZbVVHNm0BgQBqTf6snQEwDoP4GwUG5AVvCBgmIn7fY4d24v3Mc3/pV5sH50z1I/ESJLt//vG+G8/sn0JDa+ecs7wp/RNvcM45y9u7/ROI6u28f8bmnBW6wl+XF3XOgTp14DnnHCbFi9dFLRhJLjzr7Hn4Ftjn933sodXfu8dCnWekF28qZ0w/Ov+oElV8f0io2tn1fAJMBbkaUxYHBgAAAABJRU5ErkJggg==\n",
|
|
"text/plain": [
|
|
"<PIL.Image.Image image mode=RGB size=37x32 at 0x7F3932624D90>"
|
|
]
|
|
},
|
|
"execution_count": 172,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"show_tc(0)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 175,
|
|
"id": "alone-olympus",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAGkAAAAUCAIAAAABXIRyAAABfUlEQVR4nO2YMQ7CMAxFU9QVBiQkpg6MDEwcgFPAzC2QOiNxC2Z6IEYGJiQkBrgAQyRjnMR13VBAypucYJz0N07iZrP5wiRU9L49gT8mx431rgR7v9kS1/WuJJ0hfz4OiYadmVDQyft76Q+GYD/uN965mEzPpyPvY3lpR6Rxm+SfIX8+jjdarb6MszsxQn8wxHqRZhtEOet9BjXCaHEH/QS5t1eyLkIPxj/wV15DiNG4APt6OYNdTKZg4/ytqoM1lsuV8WpnJ1SbC+5fSI81avPXtNs324D1Go0LaGK9YPurqoOVDKDaKd4kvyuF9kHX043G6y6c6uN+w2cFBq87BfScjSIc49woeCzIWWENvNCMSsc37aIIJ19fjcYSjtIl+rtxrNl3uRgjXlCMMRmuySR7NvzE3FEb3Y2F4+o2OwvkKRGO5KlNYXzIGvaczVI9qybVs3qSdnqSdnqSdnqSdnqC9SzpAfsXvtNFqXNJXaHAU8+6PT/1nU4ybjc8AfzHHaob9pe4AAAAAElFTkSuQmCC\n",
|
|
"text/plain": [
|
|
"<PIL.Image.Image image mode=RGB size=105x20 at 0x7F393260E520>"
|
|
]
|
|
},
|
|
"execution_count": 175,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"show_tc(1)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 176,
|
|
"id": "certified-olive",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAGEAAABhCAIAAABJZFj0AAAEqElEQVR4nO2dPU5cMRDHTUSRRIECCYlqC0qKVDlArrK3iEQdiVtwq5QpqJCQKOACKbwZZsfzZT/vWxvmV/l5vX7e4c3Y/j/bnHz/8TMFKp+O3YAJOMUX27tbSN//+k2Kbu9uSaZUXq+H1IYLK1VBpl6e5ez8AtKvL8964c31zcPfPzjnzUbEBOUlqUsqr9fD1mbaUSlcNoxwdn6B7UIuPbh8jW1rM87a+t50CadsrufvLP0A/YcdxdwSl1cbSD89PkB6c32TE9npGBvlG5vPcPkVkpMTpt+lZXFtCdgul1cbuBTjETSrtjV61JDiVFmyrE23r7Opry/POGZj8HOkQPu1LgZSCldV3gsSs3MCPzhJtdeejboYyP+8VN3LeZdD0D6G7NXKNR+uho4/pXSC5yKe2AkfKWO5qjGk875twSgD/kUMRPwrux50aul/8D6J+ZpJzNdswkY2YSObsJFN2MhGnK+RHEiPoBN1mceRcbYCM18rc4bSiTz37cuer31wnUjCnq+9A51I0mrb9SOFEXQiom055RFI4ykbqx9perbJIDpRQzyS9CMnXhtNoROxlJp/bQ0uG30QnUjCHkPOqBP1RdSP0sA6UW3MJv6VXY8VjzKkXwv9yCbmayLwNO1i9rzBIiN5nNSLff76jc3/gvJhlBS+ZhO+ZhM2stlbW4M/kHQcZSImrRJQ+n6l/JL2ADkeNbxTw+ziEfxI3A74zWU+rgJPa9kCynelMkvag+lio6W+5uwQPQYalp2vNYtESXaxWg5nR1Y/ksbZ5XtaXs9OjrmC6VakvJJfku3ea/0R2OXs/CLLANlAYJfLq03Wj7KBiH5Ex0f6H7M2LvjL6wXwpf7ugEDiEVwSGwGsjZh1tYPrRMpijQNB+362z/K/tGhj8Ii+69d6tZIEkYPS0bI5Hkmf7o2PCPpYDqPEC8/YTx92KfU0KNkN/VrMaW1ivmYTNrIJG9mEjWzCRja2foQZVidaiDQ1yRj6ES46sk60EN1GXl/7CDqRhKEfZYbSiWp9kH1Jm+RNNIZ+NIVORG6kL0cotRFJP8oJl34E9041cWFNnWiJfgSwNpI0Nu/aGk+xvrAPJmvT7vBr/UInwpDnqHEMOalOlONR7bfe4tEsOlFVPEo1/VrsX2sn5msisf4o1h91JXzNJmxkI46ztyvuO6uar+kTNJOGLf7t59YkobnS8Gcr7POQ8o8LnrgxvuZs5SA/ZgU6nFujsLC2Lr6Z5BEAu38Nj7MzrnNrurT1vn7fmeSDVb4p7Tsqz63Jl9m/sKXE89ikH+Nvqx5o4FKRNwcZ2Yo65JpIUtGhlxpVnxHVXSoaP6I796679q8tboyXMS1ra7VSrK2NwUr5ciBalsdU3Vc6j+3p8UHal02IOa1NzNdswkY2YSObsJFN2MhGXH+UJteJ/MAIQOr+XeeMvmOdyHNS1HrnRMxL3dk+EivrREv0o/I9bbmITTv/aAqdqNZnpbPqs1FKX9POP5pUJ1ohDvTxNSfH0olWOiNKYoqI3m1f9qQ60QrNrj4/Ww9Gzno8S5DMdUxsVSzK/2Bhx0dx/lE1MV8TifVH9vojIHzNJnzN5h+fL/vKYArbwwAAAABJRU5ErkJggg==\n",
|
|
"text/plain": [
|
|
"<PIL.Image.Image image mode=RGB size=97x97 at 0x7F393298BE20>"
|
|
]
|
|
},
|
|
"execution_count": 176,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"show_tc(2)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 186,
|
|
"id": "empty-scoop",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<PIL.Image.Image image mode=RGB size=400x400 at 0x7F393298B430>"
|
|
]
|
|
},
|
|
"execution_count": 186,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"show_tc(3)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 191,
|
|
"id": "christian-intention",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"'0x41'"
|
|
]
|
|
},
|
|
"execution_count": 191,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"hex(ord('A'))"
|
|
]
|
|
}
|
|
],
|
|
"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
|
|
}
|