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))
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
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