Skip to content

Instantly share code, notes, and snippets.

@standarddeviant
Created September 6, 2022 02:55
Show Gist options
  • Save standarddeviant/897ce2682b240c6e0440c630917b6741 to your computer and use it in GitHub Desktop.
Save standarddeviant/897ce2682b240c6e0440c630917b6741 to your computer and use it in GitHub Desktop.
bits.ipynb
Display the source blob
Display the rendered blob
Raw
{
"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