Run autopep8
[gram.git] / gram / phy / dfi.py
1 # This file is Copyright (c) 2015 Sebastien Bourdeauducq <sb@m-labs.hk>
2 # This file is Copyright (c) 2020 LambdaConcept <contact@lambdaconcept.com>
3
4 from nmigen import *
5 from nmigen.hdl.rec import *
6
7 __ALL__ = ["Interface"]
8
9
10 def phase_description(addressbits, bankbits, nranks, databits):
11 return [
12 # cmd description
13 ("address", addressbits, DIR_FANOUT),
14 ("bank", bankbits, DIR_FANOUT),
15 ("cas_n", 1, DIR_FANOUT),
16 ("cs_n", nranks, DIR_FANOUT),
17 ("ras_n", 1, DIR_FANOUT),
18 ("we_n", 1, DIR_FANOUT),
19 ("cke", nranks, DIR_FANOUT),
20 ("odt", nranks, DIR_FANOUT),
21 ("reset_n", 1, DIR_FANOUT),
22 ("act_n", 1, DIR_FANOUT),
23 # wrdata description
24 ("wrdata", databits, DIR_FANOUT),
25 ("wrdata_en", 1, DIR_FANOUT),
26 ("wrdata_mask", databits//8, DIR_FANOUT),
27 # rddata description
28 ("rddata_en", 1, DIR_FANOUT),
29 ("rddata", databits, DIR_FANIN),
30 ("rddata_valid", 1, DIR_FANIN),
31 ]
32
33
34 class Interface:
35 def __init__(self, addressbits, bankbits, nranks, databits, nphases=1):
36 self.phases = []
37 for p in range(nphases):
38 p = Record(phase_description(
39 addressbits, bankbits, nranks, databits))
40 self.phases += [p]
41 p.cas_n.reset = 1
42 p.cs_n.reset = (2**nranks-1)
43 p.ras_n.reset = 1
44 p.we_n.reset = 1
45 p.act_n.reset = 1
46
47 def connect(self, target):
48 if not isinstance(target, Interface):
49 raise TypeError("Target must be an instance of Interface, not {!r}"
50 .format(target))
51
52 ret = []
53 for i in range(min(len(self.phases), len(target.phases))):
54 ret += [self.phases[i].connect(target.phases[i])]
55
56 return ret