re-bba-rb/re-bba/ReBba/amaranth_boards/resources/user.py

44 lines
1.5 KiB
Python

from amaranth.build import *
__all__ = ["LEDResources", "RGBLEDResource", "ButtonResources", "SwitchResources"]
def _SplitResources(*args, pins, invert=False, conn=None, attrs=None, default_name, dir):
assert isinstance(pins, (str, list, dict))
if isinstance(pins, str):
pins = pins.split()
if isinstance(pins, list):
pins = dict(enumerate(pins))
resources = []
for number, pin in pins.items():
ios = [Pins(pin, dir=dir, invert=invert, conn=conn)]
if attrs is not None:
ios.append(attrs)
resources.append(Resource.family(*args, number, default_name=default_name, ios=ios))
return resources
def LEDResources(*args, **kwargs):
return _SplitResources(*args, **kwargs, default_name="led", dir="o")
def RGBLEDResource(*args, r, g, b, invert=False, conn=None, attrs=None):
ios = []
ios.append(Subsignal("r", Pins(r, dir="o", invert=invert, conn=conn, assert_width=1)))
ios.append(Subsignal("g", Pins(g, dir="o", invert=invert, conn=conn, assert_width=1)))
ios.append(Subsignal("b", Pins(b, dir="o", invert=invert, conn=conn, assert_width=1)))
if attrs is not None:
ios.append(attrs)
return Resource.family(*args, default_name="rgb_led", ios=ios)
def ButtonResources(*args, **kwargs):
return _SplitResources(*args, **kwargs, default_name="button", dir="i")
def SwitchResources(*args, **kwargs):
return _SplitResources(*args, **kwargs, default_name="switch", dir="i")