add features option to gramCore and PHY wishbone buses, not sure if
[gram.git] / gram / core / __init__.py
1 from nmigen import *
2
3 from lambdasoc.periph import Peripheral
4
5 from gram.dfii import DFIInjector
6 from gram.compat import CSRPrefixProxy
7 from gram.core.controller import ControllerSettings, gramController
8 from gram.core.crossbar import gramCrossbar
9
10 __ALL__ = ["gramCore"]
11
12 class gramCore(Peripheral, Elaboratable):
13 def __init__(self, phy, geom_settings, timing_settings, clk_freq,
14 features=frozenset(), **kwargs):
15 super().__init__("core")
16
17 bank = self.csr_bank()
18
19 self._phy = phy
20 self._geom_settings = geom_settings
21 self._timing_settings = timing_settings
22 self._clk_freq = clk_freq
23 self._kwargs = kwargs
24
25 self.dfii = DFIInjector(
26 csr_bank=CSRPrefixProxy(bank, "dfii"),
27 addressbits=self._geom_settings.addressbits,
28 bankbits=self._geom_settings.bankbits,
29 nranks=self._phy.settings.nranks,
30 databits=self._phy.settings.dfi_databits,
31 nphases=self._phy.settings.nphases)
32
33 self.controller = gramController(
34 phy_settings=self._phy.settings,
35 geom_settings=self._geom_settings,
36 timing_settings=self._timing_settings,
37 clk_freq=self._clk_freq,
38 **self._kwargs)
39
40 # Size in bytes
41 self.size = 2**geom_settings.bankbits * 2**geom_settings.rowbits * 2**geom_settings.colbits
42
43 self.crossbar = gramCrossbar(self.controller.interface)
44
45 self._bridge = self.bridge(data_width=32, granularity=8, alignment=2,
46 features=features)
47 self.bus = self._bridge.bus
48
49 def elaborate(self, platform):
50 m = Module()
51
52 m.submodules.bridge = self._bridge
53
54 m.submodules.dfii = self.dfii
55 m.d.comb += self.dfii.master.connect(self._phy.dfi)
56
57 m.submodules.controller = self.controller
58 m.d.comb += self.controller.dfi.connect(self.dfii.slave)
59
60 m.submodules.crossbar = self.crossbar
61
62 return m