-
Notifications
You must be signed in to change notification settings - Fork 114
/
Copy pathinterface.py
151 lines (126 loc) · 6.2 KB
/
interface.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
from amaranth.build import *
__all__ = [
"UARTResource", "IrDAResource", "SPIResource", "I2CResource",
"DirectUSBResource", "ULPIResource", "PS2Resource",
]
def UARTResource(*args, rx, tx, rts=None, cts=None, dtr=None, dsr=None, dcd=None, ri=None,
conn=None, attrs=None, role=None):
if any(line is not None for line in (rts, cts, dtr, dsr, dcd, ri)):
assert role in ("dce", "dte")
if role == "dte":
dce_to_dte = "i"
dte_to_dce = "o"
else:
dce_to_dte = "o"
dte_to_dce = "i"
io = []
io.append(Subsignal("rx", Pins(rx, dir="i", conn=conn, assert_width=1)))
io.append(Subsignal("tx", Pins(tx, dir="o", conn=conn, assert_width=1)))
if rts is not None:
io.append(Subsignal("rts", Pins(rts, dir=dte_to_dce, conn=conn, assert_width=1)))
if cts is not None:
io.append(Subsignal("cts", Pins(cts, dir=dce_to_dte, conn=conn, assert_width=1)))
if dtr is not None:
io.append(Subsignal("dtr", Pins(dtr, dir=dte_to_dce, conn=conn, assert_width=1)))
if dsr is not None:
io.append(Subsignal("dsr", Pins(dsr, dir=dce_to_dte, conn=conn, assert_width=1)))
if dcd is not None:
io.append(Subsignal("dcd", Pins(dcd, dir=dce_to_dte, conn=conn, assert_width=1)))
if ri is not None:
io.append(Subsignal("ri", Pins(ri, dir=dce_to_dte, conn=conn, assert_width=1)))
if attrs is not None:
io.append(attrs)
return Resource.family(*args, default_name="uart", ios=io)
def IrDAResource(number, *, rx, tx, en=None, sd=None,
conn=None, attrs=None):
# Exactly one of en (active-high enable) or sd (shutdown, active-low enable) should
# be specified, and it is mapped to a logic level en subsignal.
assert (en is not None) ^ (sd is not None)
io = []
io.append(Subsignal("rx", Pins(rx, dir="i", conn=conn, assert_width=1)))
io.append(Subsignal("tx", Pins(tx, dir="o", conn=conn, assert_width=1)))
if en is not None:
io.append(Subsignal("en", Pins(en, dir="o", conn=conn, assert_width=1)))
if sd is not None:
io.append(Subsignal("en", PinsN(sd, dir="o", conn=conn, assert_width=1)))
if attrs is not None:
io.append(attrs)
return Resource("irda", number, *io)
def SPIResource(*args, cs_n, clk, copi, cipo, int=None, reset=None,
conn=None, attrs=None, role="controller"):
assert role in ("controller", "peripheral")
assert copi is not None or cipo is not None # support unidirectional SPI
io = []
if role == "controller":
io.append(Subsignal("cs", PinsN(cs_n, dir="o", conn=conn)))
io.append(Subsignal("clk", Pins(clk, dir="o", conn=conn, assert_width=1)))
if copi is not None:
io.append(Subsignal("copi", Pins(copi, dir="o", conn=conn, assert_width=1)))
if cipo is not None:
io.append(Subsignal("cipo", Pins(cipo, dir="i", conn=conn, assert_width=1)))
else: # peripheral
io.append(Subsignal("cs", PinsN(cs_n, dir="i", conn=conn, assert_width=1)))
io.append(Subsignal("clk", Pins(clk, dir="i", conn=conn, assert_width=1)))
if copi is not None:
io.append(Subsignal("copi", Pins(copi, dir="i", conn=conn, assert_width=1)))
if cipo is not None:
io.append(Subsignal("cipo", Pins(cipo, dir="oe", conn=conn, assert_width=1)))
if int is not None:
if role == "controller":
io.append(Subsignal("int", Pins(int, dir="i", conn=conn)))
else:
io.append(Subsignal("int", Pins(int, dir="oe", conn=conn, assert_width=1)))
if reset is not None:
if role == "controller":
io.append(Subsignal("reset", Pins(reset, dir="o", conn=conn)))
else:
io.append(Subsignal("reset", Pins(reset, dir="i", conn=conn, assert_width=1)))
if attrs is not None:
io.append(attrs)
return Resource.family(*args, default_name="spi", ios=io)
def I2CResource(*args, scl, sda, conn=None, attrs=None):
io = []
io.append(Subsignal("scl", Pins(scl, dir="io", conn=conn, assert_width=1)))
io.append(Subsignal("sda", Pins(sda, dir="io", conn=conn, assert_width=1)))
if attrs is not None:
io.append(attrs)
return Resource.family(*args, default_name="i2c", ios=io)
def DirectUSBResource(*args, d_p, d_n, pullup=None, vbus_valid=None, conn=None, attrs=None):
io = []
io.append(Subsignal("d_p", Pins(d_p, dir="io", conn=conn, assert_width=1)))
io.append(Subsignal("d_n", Pins(d_n, dir="io", conn=conn, assert_width=1)))
if pullup:
io.append(Subsignal("pullup", Pins(pullup, dir="o", conn=conn, assert_width=1)))
if vbus_valid:
io.append(Subsignal("vbus_valid", Pins(vbus_valid, dir="i", conn=conn, assert_width=1)))
if attrs is not None:
io.append(attrs)
return Resource.family(*args, default_name="usb", ios=io)
def ULPIResource(*args, data, clk, dir, nxt, stp, rst=None, clk_dir='i',
rst_invert=False, conn=None, attrs=None, clk_attrs=None):
assert clk_dir in ('i', 'o',)
clk_subsig = Subsignal("clk", Pins(clk, dir=clk_dir, conn=conn, assert_width=1))
# If the clock is an input, we must constrain it to be 60MHz.
if clk_dir == 'i':
clk_subsig.clock = Clock(60e6)
if clk_attrs is not None:
clk_subsig.attrs.update(clk_attrs)
io = []
io.append(Subsignal("data", Pins(data, dir="io", conn=conn, assert_width=8)))
io.append(clk_subsig)
io.append(Subsignal("dir", Pins(dir, dir="i", conn=conn, assert_width=1)))
io.append(Subsignal("nxt", Pins(nxt, dir="i", conn=conn, assert_width=1)))
io.append(Subsignal("stp", Pins(stp, dir="o", conn=conn, assert_width=1)))
if rst is not None:
io.append(Subsignal("rst", Pins(rst, dir="o", invert=rst_invert,
conn=conn, assert_width=1)))
if attrs is not None:
io.append(attrs)
return Resource.family(*args, default_name="usb", ios=io)
def PS2Resource(*args, clk, dat, conn=None, attrs=None):
ios = []
ios.append(Subsignal("clk", Pins(clk, dir="i", conn=conn, assert_width=1))),
ios.append(Subsignal("dat", Pins(dat, dir="io", conn=conn, assert_width=1))),
if attrs is not None:
ios.append(attrs)
return Resource.family(*args, default_name="ps2", ios=ios)