dev.display: factor out from dev.user. NFC.
[nmigen-boards.git] / nmigen_boards / dev / user.py
1 from nmigen.build import *
2
3
4 __all__ = ["LEDResources", "RGBLEDResource", "ButtonResources", "SwitchResources"]
5
6
7 def _SplitResources(*args, pins, invert=False, attrs=None, default_name, dir):
8 assert isinstance(pins, (str, list, dict))
9
10 if isinstance(pins, str):
11 pins = pins.split()
12 if isinstance(pins, list):
13 pins = dict(enumerate(pins))
14
15 resources = []
16 for number, pin in pins.items():
17 ios = [Pins(pin, dir=dir, invert=invert)]
18 if attrs is not None:
19 ios.append(attrs)
20 resources.append(Resource.family(*args, number, default_name=default_name, ios=ios))
21 return resources
22
23
24 def LEDResources(*args, **kwargs):
25 return _SplitResources(*args, **kwargs, default_name="led", dir="o")
26
27
28 def RGBLEDResource(*args, r, g, b, invert=False, attrs=None):
29 ios = []
30 ios.append(Subsignal("r", Pins(r, dir="o", invert=invert, assert_width=1)))
31 ios.append(Subsignal("g", Pins(g, dir="o", invert=invert, assert_width=1)))
32 ios.append(Subsignal("b", Pins(b, dir="o", invert=invert, assert_width=1)))
33 if attrs is not None:
34 ios.append(attrs)
35 return Resource.family(*args, default_name="rgb_led", ios=ios)
36
37
38 def ButtonResources(*args, **kwargs):
39 return _SplitResources(*args, **kwargs, default_name="button", dir="i")
40
41
42 def SwitchResources(*args, **kwargs):
43 return _SplitResources(*args, **kwargs, default_name="switch", dir="i")