aae56b0d380075f0403fa0f2bbd7bb90f333e7ae
2 from migen
.genlib
.record
import *
5 def phase_cmd_description(addressbits
, bankbits
):
7 ("address", addressbits
, DIR_M_TO_S
),
8 ("bank", bankbits
, DIR_M_TO_S
),
9 ("cas_n", 1, DIR_M_TO_S
),
10 ("cs_n", 1, DIR_M_TO_S
),
11 ("ras_n", 1, DIR_M_TO_S
),
12 ("we_n", 1, DIR_M_TO_S
),
13 ("cke", 1, DIR_M_TO_S
),
14 ("odt", 1, DIR_M_TO_S
),
15 ("reset_n", 1, DIR_M_TO_S
)
19 def phase_wrdata_description(databits
):
21 ("wrdata", databits
, DIR_M_TO_S
),
22 ("wrdata_en", 1, DIR_M_TO_S
),
23 ("wrdata_mask", databits
//8, DIR_M_TO_S
)
27 def phase_rddata_description(databits
):
29 ("rddata_en", 1, DIR_M_TO_S
),
30 ("rddata", databits
, DIR_S_TO_M
),
31 ("rddata_valid", 1, DIR_S_TO_M
)
35 def phase_description(addressbits
, bankbits
, databits
):
36 r
= phase_cmd_description(addressbits
, bankbits
)
37 r
+= phase_wrdata_description(databits
)
38 r
+= phase_rddata_description(databits
)
42 class Interface(Record
):
43 def __init__(self
, addressbits
, bankbits
, databits
, nphases
=1):
44 layout
= [("p"+str(i
), phase_description(addressbits
, bankbits
, databits
)) for i
in range(nphases
)]
45 Record
.__init
__(self
, layout
)
46 self
.phases
= [getattr(self
, "p"+str(i
)) for i
in range(nphases
)]
53 # Returns pairs (DFI-mandated signal name, Migen signal object)
54 def get_standard_names(self
, m2s
=True, s2m
=True):
56 add_suffix
= len(self
.phases
) > 1
57 for n
, phase
in enumerate(self
.phases
):
58 for field
, size
, direction
in phase
.layout
:
59 if (m2s
and direction
== DIR_M_TO_S
) or (s2m
and direction
== DIR_S_TO_M
):
61 if direction
== DIR_M_TO_S
:
62 suffix
= "_p" + str(n
)
64 suffix
= "_w" + str(n
)
67 r
.append(("dfi_" + field
+ suffix
, getattr(phase
, field
)))
71 class Interconnect(Module
):
72 def __init__(self
, master
, slave
):
73 self
.comb
+= master
.connect(slave
)