1
+ from migen .fhdl .std import *
1
2
from migen .bank .description import CSRStatus
2
3
3
4
def get_cpu_mak (cpu_type ):
@@ -28,41 +29,42 @@ def get_mem_header(regions, flash_boot_address):
28
29
r += "#endif\n "
29
30
return r
30
31
31
- def _get_rw_functions (reg_name , reg_base , size , read_only ):
32
+ def _get_rw_functions (reg_name , reg_base , nwords , busword , read_only ):
32
33
r = ""
33
34
34
35
r += "#define CSR_" + reg_name .upper ()+ "_ADDR " + hex (reg_base )+ "\n "
35
- r += "#define CSR_" + reg_name .upper ()+ "_SIZE " + str (size )+ "\n "
36
+ r += "#define CSR_" + reg_name .upper ()+ "_SIZE " + str (nwords )+ "\n "
36
37
37
- if size > 8 :
38
+ size = nwords * busword
39
+ if size > 64 :
38
40
raise NotImplementedError ("Register too large" )
39
- elif size > 4 :
41
+ elif size > 32 :
40
42
ctype = "unsigned long long int"
41
- elif size > 2 :
43
+ elif size > 16 :
42
44
ctype = "unsigned int"
43
- elif size > 1 :
45
+ elif size > 8 :
44
46
ctype = "unsigned short int"
45
47
else :
46
48
ctype = "unsigned char"
47
49
48
50
r += "static inline " + ctype + " " + reg_name + "_read(void) {\n "
49
51
if size > 1 :
50
52
r += "\t " + ctype + " r = MMPTR(" + hex (reg_base )+ ");\n "
51
- for byte in range (1 , size ):
52
- r += "\t r <<= 8 ;\n \t r |= MMPTR(" + hex (reg_base + 4 * byte )+ ");\n "
53
+ for byte in range (1 , nwords ):
54
+ r += "\t r <<= " + str ( busword ) + " ;\n \t r |= MMPTR("+ hex (reg_base + 4 * byte )+ ");\n "
53
55
r += "\t return r;\n }\n "
54
56
else :
55
57
r += "\t return MMPTR(" + hex (reg_base )+ ");\n }\n "
56
58
57
59
if not read_only :
58
60
r += "static inline void " + reg_name + "_write(" + ctype + " value) {\n "
59
- for byte in range (size ):
60
- shift = (size - byte - 1 )* 8
61
+ for word in range (nwords ):
62
+ shift = (nwords - word - 1 )* busword
61
63
if shift :
62
64
value_shifted = "value >> " + str (shift )
63
65
else :
64
66
value_shifted = "value"
65
- r += "\t MMPTR(" + hex (reg_base + 4 * byte )+ ") = " + value_shifted + ";\n "
67
+ r += "\t MMPTR(" + hex (reg_base + 4 * word )+ ") = " + value_shifted + ";\n "
66
68
r += "}\n "
67
69
return r
68
70
@@ -72,9 +74,10 @@ def get_csr_header(csr_base, bank_array, interrupt_map):
72
74
r += "\n /* " + name + " */\n "
73
75
reg_base = csr_base + 0x800 * mapaddr
74
76
r += "#define " + name .upper ()+ "_BASE " + hex (reg_base )+ "\n "
77
+ busword = flen (rmap .bus .dat_w )
75
78
for csr in csrs :
76
- nr = (csr .size + 7 )// 8
77
- r += _get_rw_functions (name + "_" + csr .name , reg_base , nr , isinstance (csr , CSRStatus ))
79
+ nr = (csr .size + busword - 1 )// busword
80
+ r += _get_rw_functions (name + "_" + csr .name , reg_base , nr , busword , isinstance (csr , CSRStatus ))
78
81
reg_base += 4 * nr
79
82
try :
80
83
interrupt_nr = interrupt_map [name ]
@@ -93,8 +96,9 @@ def get_csr_csv(csr_base, bank_array):
93
96
r = ""
94
97
for name , csrs , mapaddr , rmap in bank_array .banks :
95
98
reg_base = csr_base + 0x800 * mapaddr
99
+ busword = flen (rmap .bus .dat_w )
96
100
for csr in csrs :
97
- nr = (csr .size + 7 )// 8
101
+ nr = (csr .size + busword - 1 )// busword
98
102
r += "{}_{},0x{:08x},{},{}\n " .format (name , csr .name , reg_base , nr , "ro" if isinstance (csr , CSRStatus ) else "rw" )
99
103
reg_base += 4 * nr
100
104
return r
0 commit comments