0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 function extract_value(s)
0011 {
0012 eqat = index(s, "=")
0013 comat = index(s, ",")
0014 return substr(s, eqat+2, (comat-eqat)-2)
0015 }
0016
0017 function remove_brackets(b)
0018 {
0019 return substr(b, 2, length(b)-2)
0020 }
0021
0022 function splitdefine(l, p)
0023 {
0024 r = split(l, tp)
0025
0026 p[0] = tp[2]
0027 p[1] = remove_brackets(tp[3])
0028 }
0029
0030 function find_length(f)
0031 {
0032 if (0)
0033 printf "find_length " f "\n" > "/dev/stderr"
0034
0035 if (f ~ /0x1/)
0036 return 1
0037 else if (f ~ /0x3/)
0038 return 2
0039 else if (f ~ /0x7/)
0040 return 3
0041 else if (f ~ /0xf/)
0042 return 4
0043
0044 printf "unknown length " f "\n" > "/dev/stderr"
0045 exit
0046 }
0047
0048 function find_shift(s)
0049 {
0050 id = index(s, "<")
0051 if (id <= 0) {
0052 printf "cannot find shift " s "\n" > "/dev/stderr"
0053 exit
0054 }
0055
0056 return substr(s, id+2)
0057 }
0058
0059
0060 BEGIN {
0061 if (ARGC < 2) {
0062 print "too few arguments" > "/dev/stderr"
0063 exit
0064 }
0065
0066
0067
0068
0069 while (getline line < ARGV[1] > 0) {
0070 if (line ~ /\#define.*_MASK/ &&
0071 !(line ~ /USB_SIG_MASK/)) {
0072 splitdefine(line, fields)
0073 name = fields[0]
0074 if (0)
0075 printf "MASK " line "\n" > "/dev/stderr"
0076 dmask[name,0] = find_length(fields[1])
0077 dmask[name,1] = find_shift(fields[1])
0078 if (0)
0079 printf "=> '" name "' LENGTH=" dmask[name,0] " SHIFT=" dmask[name,1] "\n" > "/dev/stderr"
0080 } else {
0081 }
0082 }
0083
0084 delete ARGV[1]
0085 }
0086
0087 /clksrc_clk.*=.*{/ {
0088 shift=""
0089 mask=""
0090 divshift=""
0091 reg_div=""
0092 reg_src=""
0093 indent=1
0094
0095 print $0
0096
0097 for(; indent >= 1;) {
0098 if ((getline line) <= 0) {
0099 printf "unexpected end of file" > "/dev/stderr"
0100 exit 1;
0101 }
0102
0103 if (line ~ /\.shift/) {
0104 shift = extract_value(line)
0105 } else if (line ~ /\.mask/) {
0106 mask = extract_value(line)
0107 } else if (line ~ /\.reg_divider/) {
0108 reg_div = extract_value(line)
0109 } else if (line ~ /\.reg_source/) {
0110 reg_src = extract_value(line)
0111 } else if (line ~ /\.divider_shift/) {
0112 divshift = extract_value(line)
0113 } else if (line ~ /{/) {
0114 indent++
0115 print line
0116 } else if (line ~ /}/) {
0117 indent--
0118
0119 if (indent == 0) {
0120 if (0) {
0121 printf "shift '" shift "' ='" dmask[shift,0] "'\n" > "/dev/stderr"
0122 printf "mask '" mask "'\n" > "/dev/stderr"
0123 printf "dshft '" divshift "'\n" > "/dev/stderr"
0124 printf "rdiv '" reg_div "'\n" > "/dev/stderr"
0125 printf "rsrc '" reg_src "'\n" > "/dev/stderr"
0126 }
0127
0128 generated = mask
0129 sub(reg_src, reg_div, generated)
0130
0131 if (0) {
0132 printf "/* rsrc " reg_src " */\n"
0133 printf "/* rdiv " reg_div " */\n"
0134 printf "/* shift " shift " */\n"
0135 printf "/* mask " mask " */\n"
0136 printf "/* generated " generated " */\n"
0137 }
0138
0139 if (reg_div != "") {
0140 printf "\t.reg_div = { "
0141 printf ".reg = " reg_div ", "
0142 printf ".shift = " dmask[generated,1] ", "
0143 printf ".size = " dmask[generated,0] ", "
0144 printf "},\n"
0145 }
0146
0147 printf "\t.reg_src = { "
0148 printf ".reg = " reg_src ", "
0149 printf ".shift = " dmask[mask,1] ", "
0150 printf ".size = " dmask[mask,0] ", "
0151
0152 printf "},\n"
0153
0154 }
0155
0156 print line
0157 } else {
0158 print line
0159 }
0160
0161 if (0)
0162 printf indent ":" line "\n" > "/dev/stderr"
0163 }
0164 }
0165
0166 // && ! /clksrc_clk.*=.*{/ { print $0 }