asmicon: skeleton
[litex.git] / milkymist / asmicon / __init__.py
1 from migen.fhdl.structure import *
2 from migen.bus import dfi, asmibus
3
4 from milkymist.asmicon.refresher import *
5 from milkymist.asmicon.bankmachine import *
6 from milkymist.asmicon.multiplexer import *
7
8 class PhySettings:
9 def __init__(self, dfi_a, dfi_ba, dfi_d, nphases, rdphase, wrphase):
10 self.dfi_a = dfi_a
11 self.dfi_ba = dfi_ba
12 self.dfi_d = dfi_d
13 self.nphases = nphases
14 self.rdphase = rdphase
15 self.wrphase = wrphase
16
17 class GeomSettings:
18 def __init__(self, row_a, col_a):
19 self.row_a = row_a
20 self.col_a = col_a
21
22 class TimingSettings:
23 def __init__(self, tREFI, tRFC):
24 self.tREFI = tREFI
25 self.tRFC = tRFC
26
27 class ASMIcon:
28 def __init__(self, phy_settings, geom_settings, timing_settings, time=0):
29 self.phy_settings = phy_settings
30 self.geom_settings = geom_settings
31 self.timing_settings = timing_settings
32 self.finalized = False
33
34 self.dfi = dfi.Interface(self.phy_settings.dfi_a,
35 self.phy_settings.dfi_ba,
36 self.phy_settings.dfi_d,
37 self.phy_settings.nphases)
38 burst_length = self.phy_settings.nphases*2
39 self.address_align = log2_int(burst_length)
40 aw = self.phy_settings.dfi_ba + self.geom_settings.row_a + self.geom_settings.col_a - self.address_align
41 dw = self.phy_settings.dfi_d*self.phy_settings.nphases
42 self.hub = asmibus.Hub(aw, dw, time)
43
44 def finalize(self):
45 if self.finalized:
46 raise FinalizeError
47 self.finalized = True
48 self.hub.finalize()
49 slots = self.hub.get_slots()
50 self.refresher = Refresher(self.timing_settings)
51 self.bank_machines = [BankMachine(self.geom_settings, self.timing_settings, self.address_align, i, slots) for i in range(2**self.phy_settings.dfi_ba)]
52 self.multiplexer = Multiplexer(self.phy_settings, self.geom_settings, self.timing_settings,
53 self.bank_machines, self.refresher,
54 self.dfi, self.hub)
55
56 def get_fragment(self):
57 if not self.finalized:
58 raise FinalizeError
59 return self.hub.get_fragment() + \
60 self.refresher.get_fragment() + \
61 sum([bm.get_fragment() for bm in self.bank_machines], Fragment()) + \
62 self.multiplexer.get_fragment()