Example #1
0
    def __init__(self, events, *, name=None, src_loc_at=0):
        log.debug("Create Interrupt Source")
        if name is not None and not isinstance(name, str):
            raise TypeError("Name must be a string, not {!r}".format(name))
        self.name = name or tracer.get_var_name(depth=2 + src_loc_at)

        for event in events:
            if not isinstance(event, EventSource):
                raise TypeError(
                    "Event source must be an instance of EventSource, not {!r}"
                    .format(event))
        self._events = list(events)

        width = len(events)
        self.status = csr.Element(width,
                                  "r",
                                  name="{}_status".format(self.name))
        self.pending = csr.Element(width,
                                   "rw",
                                   name="{}_pending".format(self.name))
        self.enable = csr.Element(width,
                                  "rw",
                                  name="{}_enable".format(self.name))

        self.irq = IRQLine(name="{}_irq".format(self.name))
Example #2
0
    def csr(self,
            width,
            access,
            *,
            addr=None,
            alignment=None,
            name=None,
            desc=None,
            src_loc_at=0):
        """Request a CSR register.

        Parameters
        ----------
        width : int
            Width of the register. See :class:`nmigen_soc.csr.Element`.
        access : :class:`Access`
            Register access mode. See :class:`nmigen_soc.csr.Element`.
        addr : int
            Address of the register. See :meth:`nmigen_soc.csr.Multiplexer.add`.
        alignment : int
            Register alignment. See :class:`nmigen_soc.csr.Multiplexer`.
        name : str
            Name of the register. If ``None`` (default) the name is inferred from the variable
            name this register is assigned to.
        desc: str
            Documentation for the provided register, if available.
            Used to capture register documentation automatically.


        Return value
        ------------
        An instance of :class:`nmigen_soc.csr.Element`.
        """
        if name is not None and not isinstance(name, str):
            raise TypeError("Name must be a string, not {!r}".format(name))
        name = name or tracer.get_var_name(depth=2 + src_loc_at).lstrip("_")

        elem_name = "{}_{}".format(self._name_prefix, name)
        elem = csr.Element(width, access, name=elem_name)
        self._csr_regs.append((elem, addr, alignment))
        return elem
Example #3
0
    def csr(self,
            width,
            access,
            *,
            addr=None,
            alignment=None,
            name=None,
            src_loc_at=0):
        """Request a CSR register.

        Parameters
        ----------
        width : int
            Width of the register. See :class:`nmigen_soc.csr.Element`.
        access : :class:`Access`
            Register access mode. See :class:`nmigen_soc.csr.Element`.
        addr : int
            Address of the register. See :meth:`nmigen_soc.csr.Multiplexer.add`.
        alignment : int
            Register alignment. See :class:`nmigen_soc.csr.Multiplexer`.
        name : str
            Name of the register. If ``None`` (default) the name is inferred from the variable
            name this register is assigned to.

        Return value
        ------------
        An instance of :class:`nmigen_soc.csr.Element`.
        """
        if name is not None and not isinstance(name, str):
            raise TypeError("Name must be a string, not {!r}".format(name))
        name = name or tracer.get_var_name(depth=2 + src_loc_at).lstrip("_")

        elem_name = "{}_{}".format(self._name_prefix, name)
        if any(elem.name == elem_name for (elem, _, _) in self._csr_regs):
            raise Exception(
                "CSR \"{}\" has already been defined".format(elem_name))
        elem = csr.Element(width, access, name=elem_name)
        self._csr_regs.append((elem, addr, alignment))
        return elem