Created
September 6, 2022 02:55
-
-
Save standarddeviant/897ce2682b240c6e0440c630917b6741 to your computer and use it in GitHub Desktop.
bits.ipynb
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"id": "0636f521-8391-4bd9-b856-5366330c5912", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import sys\n", | |
"from collections import namedtuple\n", | |
"bitfield_t = namedtuple('bitfield_t', 'name n')\n", | |
"class bitfields:\n", | |
" def __init__(self, **kwargs):\n", | |
" self.word_bits = kwargs.get('word_bits', 32)\n", | |
" self.prefix = kwargs.get('prefix', None)\n", | |
" self.fields = kwargs.get('fields', [])\n", | |
"\n", | |
" def __repr__(self):\n", | |
" field_bits = sum([itm.n for itm in self.fields])\n", | |
" return f'prefix = {self.prefix}, word_bits = {self.word_bits}, field_bits = {field_bits}, len(fields) = {len(self.fields)}'\n", | |
"\n", | |
" def add_bitfield(self, name, n):\n", | |
" self.fields.append(bitfield_t(name, n))\n", | |
"\n", | |
" def gen_c(self, **kwargs):\n", | |
" out = kwargs.get('cout', sys.stdout)\n", | |
" # C loop\n", | |
" out.write('\\n' + f'// START {self.prefix} C Codegen\\n' * 3)\n", | |
" bo = 0\n", | |
" for f in self.fields:\n", | |
" bshift = self.word_bits - bo - f.n\n", | |
" bmask = (2**f.n - 1) << bshift\n", | |
" invbmask = ((2**self.word_bits - 1) - bmask)\n", | |
" cpre = f'{self.prefix}{f.name}' # short-hand var \n", | |
" csh = f'{cpre}_SHIFT' # short-hand var\n", | |
" cma = f'{cpre}_MASK' # short-hand var\n", | |
" czma = f'{cpre}_ZMASK' # short-hand var\n", | |
" cget = f'{cpre}_GET' # short-hand var\n", | |
" cput = f'{cpre}_PUT' # short-hand var\n", | |
" out.write(f'// bitfield_gen_funcs (c) : name = {f.name:8s}, n = {f.n:2d}, bo = {bo:2d}\\n')\n", | |
" out.write(f'#define {csh} ({self.word_bits - bo - f.n})\\n')\n", | |
" out.write(f'#define {cma} (0x{bmask:08x})\\n')\n", | |
" out.write(f'#define {cpre}_ZMASK (0x{invbmask:08x})\\n')\n", | |
" out.write(f'#define {cget}(W) ( (W & {cma}) >> {csh} )\\n')\n", | |
" out.write(f'#define {cput}(W, X) ( (W & {cpre}_ZMASK) + ((X << {csh}) & {cma}) )\\n')\n", | |
" out.write(f'#define {cpre}_INRANGE(X) (X == ({cget}({cput}(X))))\\n')\n", | |
" bo += f.n\n", | |
" # end fields loop\n", | |
" \n", | |
" out.write(f'unsigned int {self.prefix}MAKE_WORD( \\n')\n", | |
" out.write(',\\n'.join([f' unsigned int {f.name.lower()}' for f in self.fields]))\n", | |
" out.write('\\n)\\n{\\n')\n", | |
" out.write(f' unsigned int out = 0;\\n')\n", | |
" for f in self.fields:\n", | |
" out.write(f' out += {self.prefix}{f.name}_PUT(out, {f.name.lower()});\\n')\n", | |
" out.write(' return out;\\n}\\n')\n", | |
" out.write('// END C Codegen\\n' * 3)\n", | |
" # end gen_c\n", | |
"\n", | |
" def gen_py(self, **kwargs):\n", | |
" out = kwargs.get('pyout', sys.stdout)\n", | |
" # Python loop\n", | |
" out.write('\\n' + f'# START {self.prefix}Python Codegen\\n' * 3)\n", | |
" bo = 0\n", | |
" for f in self.fields:\n", | |
" bshift = self.word_bits - bo - f.n\n", | |
" bmask = (2**f.n - 1) << bshift\n", | |
" invbmask = ((2**self.word_bits - 1) - bmask)\n", | |
" cpre = f'{self.prefix}{f.name}' # short-hand var \n", | |
" csh = f'{cpre}_SHIFT' # short-hand var\n", | |
" cma = f'{cpre}_MASK' # short-hand var\n", | |
" czma = f'{cpre}_ZMASK' # short-hand var\n", | |
" cget = f'{cpre}_GET' # short-hand var\n", | |
" cput = f'{cpre}_PUT' # short-hand var\n", | |
" # czma = f'{cpre}_ZMASK # \n", | |
" out.write(f'# bitfield_gen_funcs (py) : name = {f.name:8s}, n = {f.n:2d}, bo = {bo:2d}\\n')\n", | |
" out.write(f'{csh} = ({self.word_bits - bo - f.n})\\n')\n", | |
" out.write(f'{cma} = (0x{bmask:08x})\\n')\n", | |
" out.write(f'{czma} = (0x{invbmask:08x})\\n')\n", | |
" out.write(f'def {cget}(W):\\n return ( (W & {cma}) >> {csh} )\\n')\n", | |
" out.write(f'def {cput}(W, X):\\n return ( (W & {cpre}_ZMASK) + ((X << {csh}) & {cma}) )\\n')\n", | |
" out.write(f'def {cpre}_INRANGE(X):\\n return (X == {cget}({cput}(X)))\\n')\n", | |
" bo += f.n\n", | |
" # end py loop\n", | |
" \n", | |
" out.write(f'def {self.prefix}MAKE_WORD(' + ','.join([f.name.lower() for f in self.fields]) + '):\\n')\n", | |
" out.write(f' out = int(0)\\n')\n", | |
" out.write('\\n'.join([f' out = {self.prefix}{f.name}_PUT(out, {f.name.lower()})' for f in self.fields]))\n", | |
" out.write(f'\\n return out\\n# end {self.prefix}MKWORD\\n')\n", | |
"\n", | |
" out.write(f'def {self.prefix}PARSE_WORD(word):\\n')\n", | |
" out.write(f' out = dict()\\n')\n", | |
" out.write('\\n'.join([f\" out['{f.name.lower()}'] = {self.prefix}{f.name}_GET(word)\" for f in self.fields]))\n", | |
" out.write(f'\\n return out\\n# end {self.prefix}PARSE_WORD\\n\\n')\n", | |
" out.write('\\n' + '# END Python Codegen\\n' * 3)\n", | |
" # end gen_py\n", | |
"# end bitfields class" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"id": "e510ddf1-b864-4b61-8f24-57754df31e95", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"prefix = MU_, word_bits = 32, field_bits = 32, len(fields) = 4" | |
] | |
}, | |
"execution_count": 2, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# create isntance of bitfields class\n", | |
"mu_bitfields = bitfields(prefix='MU_', word_bits=32)\n", | |
"mu_bitfields.add_bitfield('MTYPE' , 5)\n", | |
"mu_bitfields.add_bitfield('PART' , 5)\n", | |
"mu_bitfields.add_bitfield('OFF4KIB', 6)\n", | |
"mu_bitfields.add_bitfield('NFRAMES', 16)\n", | |
"mu_bitfields" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"id": "a14a0d67-baac-46a3-9462-9fbbdfec9349", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"\n", | |
"// START MU_ C Codegen\n", | |
"// START MU_ C Codegen\n", | |
"// START MU_ C Codegen\n", | |
"// bitfield_gen_funcs (c) : name = MTYPE , n = 5, bo = 0\n", | |
"#define MU_MTYPE_SHIFT (27)\n", | |
"#define MU_MTYPE_MASK (0xf8000000)\n", | |
"#define MU_MTYPE_ZMASK (0x07ffffff)\n", | |
"#define MU_MTYPE_GET(W) ( (W & MU_MTYPE_MASK) >> MU_MTYPE_SHIFT )\n", | |
"#define MU_MTYPE_PUT(W, X) ( (W & MU_MTYPE_ZMASK) + ((X << MU_MTYPE_SHIFT) & MU_MTYPE_MASK) )\n", | |
"#define MU_MTYPE_INRANGE(X) (X == (MU_MTYPE_GET(MU_MTYPE_PUT(X))))\n", | |
"// bitfield_gen_funcs (c) : name = PART , n = 5, bo = 5\n", | |
"#define MU_PART_SHIFT (22)\n", | |
"#define MU_PART_MASK (0x07c00000)\n", | |
"#define MU_PART_ZMASK (0xf83fffff)\n", | |
"#define MU_PART_GET(W) ( (W & MU_PART_MASK) >> MU_PART_SHIFT )\n", | |
"#define MU_PART_PUT(W, X) ( (W & MU_PART_ZMASK) + ((X << MU_PART_SHIFT) & MU_PART_MASK) )\n", | |
"#define MU_PART_INRANGE(X) (X == (MU_PART_GET(MU_PART_PUT(X))))\n", | |
"// bitfield_gen_funcs (c) : name = OFF4KIB , n = 6, bo = 10\n", | |
"#define MU_OFF4KIB_SHIFT (16)\n", | |
"#define MU_OFF4KIB_MASK (0x003f0000)\n", | |
"#define MU_OFF4KIB_ZMASK (0xffc0ffff)\n", | |
"#define MU_OFF4KIB_GET(W) ( (W & MU_OFF4KIB_MASK) >> MU_OFF4KIB_SHIFT )\n", | |
"#define MU_OFF4KIB_PUT(W, X) ( (W & MU_OFF4KIB_ZMASK) + ((X << MU_OFF4KIB_SHIFT) & MU_OFF4KIB_MASK) )\n", | |
"#define MU_OFF4KIB_INRANGE(X) (X == (MU_OFF4KIB_GET(MU_OFF4KIB_PUT(X))))\n", | |
"// bitfield_gen_funcs (c) : name = NFRAMES , n = 16, bo = 16\n", | |
"#define MU_NFRAMES_SHIFT (0)\n", | |
"#define MU_NFRAMES_MASK (0x0000ffff)\n", | |
"#define MU_NFRAMES_ZMASK (0xffff0000)\n", | |
"#define MU_NFRAMES_GET(W) ( (W & MU_NFRAMES_MASK) >> MU_NFRAMES_SHIFT )\n", | |
"#define MU_NFRAMES_PUT(W, X) ( (W & MU_NFRAMES_ZMASK) + ((X << MU_NFRAMES_SHIFT) & MU_NFRAMES_MASK) )\n", | |
"#define MU_NFRAMES_INRANGE(X) (X == (MU_NFRAMES_GET(MU_NFRAMES_PUT(X))))\n", | |
"unsigned int MU_MAKE_WORD( \n", | |
" unsigned int mtype,\n", | |
" unsigned int part,\n", | |
" unsigned int off4kib,\n", | |
" unsigned int nframes\n", | |
")\n", | |
"{\n", | |
" unsigned int out = 0;\n", | |
" out += MU_MTYPE_PUT(out, mtype);\n", | |
" out += MU_PART_PUT(out, part);\n", | |
" out += MU_OFF4KIB_PUT(out, off4kib);\n", | |
" out += MU_NFRAMES_PUT(out, nframes);\n", | |
" return out;\n", | |
"}\n", | |
"// END C Codegen\n", | |
"// END C Codegen\n", | |
"// END C Codegen\n" | |
] | |
} | |
], | |
"source": [ | |
"mu_bitfields.gen_c()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"id": "ef6ad8b3-9f21-4c20-8104-1bbca45f2dc7", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"with open('mu_bitfields.py', 'w') as f:\n", | |
" mu_bitfields.gen_py(pyout=f)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"id": "2ec9b57e-c804-4e49-9c41-ab4e9c42fde7", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"%run mu_bitfields.py" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"id": "9c86b699-5b1c-4911-9850-58c6edf56cc7", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"'0x0c800140'" | |
] | |
}, | |
"execution_count": 6, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"w = MU_MAKE_WORD(1, 18, 0, 320)\n", | |
"f'0x{w:08x}'" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"id": "2c9d60ff-4a85-49b4-8e50-0ddf472dfa9f", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"{'mtype': 1, 'part': 18, 'off4kib': 0, 'nframes': 320}" | |
] | |
}, | |
"execution_count": 7, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"d = MU_PARSE_WORD(w)\n", | |
"d" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "0fec696b-4801-4fd4-9062-3dc4fcca650c", | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3 (ipykernel)", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.10.4" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 5 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment