Revision 2bba9ca0 host/lib/ic_reg_maps/gen_max2829_regs.py
| b/host/lib/ic_reg_maps/gen_max2829_regs.py | ||
|---|---|---|
| 16 | 16 |
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
| 17 | 17 |
# |
| 18 | 18 |
|
| 19 |
import sys |
|
| 20 |
from common import * |
|
| 21 |
|
|
| 22 | 19 |
######################################################################## |
| 23 | 20 |
# Template for raw text data describing registers |
| 24 | 21 |
# name addr[bit range inclusive] default optional enums |
| 25 | 22 |
######################################################################## |
| 26 |
REGS_DATA_TMPL="""\
|
|
| 23 |
REGS_TMPL="""\ |
|
| 27 | 24 |
######################################################################## |
| 28 | 25 |
## Note: offsets given from perspective of data bits (excludes address) |
| 29 | 26 |
######################################################################## |
| ... | ... | |
| 109 | 106 |
""" |
| 110 | 107 |
|
| 111 | 108 |
######################################################################## |
| 112 |
# Header and Source templates below
|
|
| 109 |
# Template for methods in the body of the struct
|
|
| 113 | 110 |
######################################################################## |
| 114 |
HEADER_TEXT=""" |
|
| 115 |
#import time |
|
| 116 |
|
|
| 117 |
/*********************************************************************** |
|
| 118 |
* This file was generated by $file on $time.strftime("%c")
|
|
| 119 |
**********************************************************************/ |
|
| 120 |
|
|
| 121 |
\#ifndef INCLUDED_MAX2829_REGS_HPP |
|
| 122 |
\#define INCLUDED_MAX2829_REGS_HPP |
|
| 123 |
|
|
| 124 |
\#include <boost/cstdint.hpp> |
|
| 125 |
|
|
| 126 |
struct max2829_regs_t{
|
|
| 127 |
#for $reg in $regs |
|
| 128 |
#if $reg.get_enums() |
|
| 129 |
enum $(reg.get_name())_t{
|
|
| 130 |
#for $i, $enum in enumerate($reg.get_enums()) |
|
| 131 |
#set $end_comma = ',' if $i < len($reg.get_enums())-1 else '' |
|
| 132 |
$(reg.get_name().upper())_$(enum[0].upper()) = $enum[1]$end_comma |
|
| 111 |
BODY_TMPL="""\ |
|
| 112 |
boost::uint32_t get_reg(boost::uint8_t addr){
|
|
| 113 |
boost::uint16_t reg = 0; |
|
| 114 |
switch(addr){
|
|
| 115 |
#for $addr in range(2, 12+1) |
|
| 116 |
case $addr: |
|
| 117 |
#for $reg in filter(lambda r: r.get_addr() == addr, $regs) |
|
| 118 |
reg |= (boost::uint16_t($reg.get_name()) & $reg.get_mask()) << $reg.get_shift(); |
|
| 133 | 119 |
#end for |
| 134 |
} $reg.get_name(); |
|
| 135 |
#else |
|
| 136 |
boost::$reg.get_stdint_type() $reg.get_name(); |
|
| 137 |
#end if |
|
| 138 |
#end for |
|
| 139 |
|
|
| 140 |
max2829_regs_t(void){
|
|
| 141 |
#for $reg in $regs |
|
| 142 |
$reg.get_name() = $reg.get_default(); |
|
| 143 |
#end for |
|
| 120 |
break; |
|
| 121 |
#end for |
|
| 144 | 122 |
} |
| 145 |
|
|
| 146 |
boost::uint32_t get_reg(boost::uint8_t addr){
|
|
| 147 |
boost::uint16_t reg = 0; |
|
| 148 |
switch(addr){
|
|
| 149 |
#for $addr in range(2, 12+1) |
|
| 150 |
case $addr: |
|
| 151 |
#for $reg in filter(lambda r: r.get_addr() == addr, $regs) |
|
| 152 |
reg |= (boost::uint16_t($reg.get_name()) & $reg.get_mask()) << $reg.get_shift(); |
|
| 153 |
#end for |
|
| 154 |
break; |
|
| 155 |
#end for |
|
| 156 |
} |
|
| 157 |
return (boost::uint32_t(reg) << 4) | (addr & 0xf); |
|
| 158 |
} |
|
| 159 |
}; |
|
| 160 |
|
|
| 161 |
\#endif /* INCLUDED_MAX2829_REGS_HPP */ |
|
| 123 |
return (boost::uint32_t(reg) << 4) | (addr & 0xf); |
|
| 124 |
} |
|
| 162 | 125 |
""" |
| 163 | 126 |
|
| 164 | 127 |
if __name__ == '__main__': |
| 165 |
regs = map(reg, parse_tmpl(REGS_DATA_TMPL).splitlines()) |
|
| 166 |
open(sys.argv[1], 'w').write(parse_tmpl(HEADER_TEXT, regs=regs, file=__file__)) |
|
| 128 |
import common; common.generate( |
|
| 129 |
name='max2829_regs', |
|
| 130 |
regs_tmpl=REGS_TMPL, |
|
| 131 |
body_tmpl=BODY_TMPL, |
|
| 132 |
file=__file__, |
|
| 133 |
) |
|
Also available in: Unified diff