ace7b2af0ae951477a7898f0a34ec142388252e9
1 from operator
import itemgetter
4 from migen
.bank
.description
import CSRStatus
6 def get_macros(filename
):
7 f
= open(filename
, "r")
10 match
= re
.match("\w*#define\s+(\w+)\s+(.*)", line
, re
.IGNORECASE
)
12 r
[match
.group(1)] = match
.group(2)
15 def _get_rw_functions(reg_name
, reg_base
, size
, read_only
):
18 raise NotImplementedError("Register too large")
20 ctype
= "unsigned long long int"
22 ctype
= "unsigned int"
24 ctype
= "unsigned short int"
26 ctype
= "unsigned char"
28 r
+= "static inline "+ctype
+" "+reg_name
+"_read(void) {\n"
30 r
+= "\t"+ctype
+" r = MMPTR("+hex(reg_base
)+");\n"
31 for byte
in range(1, size
):
32 r
+= "\tr <<= 8;\n\tr |= MMPTR("+hex(reg_base
+4*byte
)+");\n"
33 r
+= "\treturn r;\n}\n"
35 r
+= "\treturn MMPTR("+hex(reg_base
)+");\n}\n"
38 r
+= "static inline void "+reg_name
+"_write("+ctype
+" value) {\n"
39 for byte
in range(size
):
40 shift
= (size
-byte
-1)*8
42 value_shifted
= "value >> "+str(shift
)
44 value_shifted
= "value"
45 r
+= "\tMMPTR("+hex(reg_base
+4*byte
)+") = "+value_shifted
+";\n"
49 def get_csr_header(csr_base
, bank_array
, interrupt_map
):
50 r
= "#ifndef __HW_CSR_H\n#define __HW_CSR_H\n#include <hw/common.h>\n"
51 for name
, csrs
, mapaddr
, rmap
in bank_array
.banks
:
52 r
+= "\n/* "+name
+" */\n"
53 reg_base
= csr_base
+ 0x800*mapaddr
54 r
+= "#define "+name
.upper()+"_BASE "+hex(reg_base
)+"\n"
56 nr
= (csr
.size
+ 7)//8
57 r
+= _get_rw_functions(name
+ "_" + csr
.name
, reg_base
, nr
, isinstance(csr
, CSRStatus
))
60 interrupt_nr
= interrupt_map
[name
]
64 r
+= "#define "+name
.upper()+"_INTERRUPT "+str(interrupt_nr
)+"\n"