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