From 722edfe9e86098ffb87a3809d60e3e702a4cc97e Mon Sep 17 00:00:00 2001 From: Tim 'mithro' Ansell Date: Fri, 16 Dec 2016 15:41:15 +0100 Subject: [PATCH 1/2] Provide csr_data_width via the constants. --- litex/soc/integration/soc_core.py | 1 + litex/soc/tools/remote/comm_udp.py | 2 +- litex/soc/tools/remote/csr_builder.py | 15 +++++++++++++-- litex/soc/tools/remote/litex_client.py | 4 +++- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/litex/soc/integration/soc_core.py b/litex/soc/integration/soc_core.py index 66dec8587..8e3f7a224 100644 --- a/litex/soc/integration/soc_core.py +++ b/litex/soc/integration/soc_core.py @@ -98,6 +98,7 @@ class SoCCore(Module): self.submodules.wishbone2csr = wishbone2csr.WB2CSR( bus_csr=csr_bus.Interface(csr_data_width, csr_address_width)) + self.add_constant("CSR_DATA_WIDTH", csr_data_width) self.register_mem("csr", self.mem_map["csr"], self.wishbone2csr.wishbone) if with_uart: diff --git a/litex/soc/tools/remote/comm_udp.py b/litex/soc/tools/remote/comm_udp.py index b4624b370..10179128f 100644 --- a/litex/soc/tools/remote/comm_udp.py +++ b/litex/soc/tools/remote/comm_udp.py @@ -5,7 +5,7 @@ from litex.soc.tools.remote.etherbone import EtherboneReads, EtherboneWrites from litex.soc.tools.remote.csr_builder import CSRBuilder class CommUDP(CSRBuilder): - def __init__(self, server="192.168.1.50", port=1234, csr_csv="csr.csv", csr_data_width=32, debug=False): + def __init__(self, server="192.168.1.50", port=1234, csr_csv="csr.csv", csr_data_width=None, debug=False): if csr_csv is not None: CSRBuilder.__init__(self, self, csr_csv, csr_data_width) self.server = server diff --git a/litex/soc/tools/remote/csr_builder.py b/litex/soc/tools/remote/csr_builder.py index e30a18ad6..fa170ea59 100644 --- a/litex/soc/tools/remote/csr_builder.py +++ b/litex/soc/tools/remote/csr_builder.py @@ -52,9 +52,20 @@ class CSRMemoryRegion: class CSRBuilder: - def __init__(self, comm, csr_csv, csr_data_width): - self.csr_data_width = csr_data_width + def __init__(self, comm, csr_csv, csr_data_width=None): self.constants = self.build_constants(csr_csv) + + # Load csr_data_width from the constants, otherwise it must be provided + constant_csr_data_width = self.constants.d.get('csr_data_width', None) + if csr_data_width is None: + csr_data_width = constant_csr_data_width + if csr_data_width is None: + raise KeyError('csr_data_width not found in constants, please provide!') + if csr_data_width != constant_csr_data_width: + raise KeyError('csr_data_width of {} provided but {} found in constants'.format( + csr_data_width, constant_csr_data_width)) + + self.csr_data_width = csr_data_width self.bases = self.build_bases(csr_csv) self.regs = self.build_registers(csr_csv, comm.read, comm.write) self.mems = self.build_memories(csr_csv) diff --git a/litex/soc/tools/remote/litex_client.py b/litex/soc/tools/remote/litex_client.py index d8b3f0ff0..bddbbe7f3 100644 --- a/litex/soc/tools/remote/litex_client.py +++ b/litex/soc/tools/remote/litex_client.py @@ -7,9 +7,11 @@ from litex.soc.tools.remote.csr_builder import CSRBuilder class RemoteClient(EtherboneIPC, CSRBuilder): - def __init__(self, host="localhost", port=1234, csr_csv="csr.csv", csr_data_width=32, debug=False): + def __init__(self, host="localhost", port=1234, csr_csv="csr.csv", csr_data_width=None, debug=False): if csr_csv is not None: CSRBuilder.__init__(self, self, csr_csv, csr_data_width) + else: + assert csr_data_width is not None self.host = host self.port = port self.debug = debug From 1f6dc446d298979ac156c3261f95c8aec6d8c200 Mon Sep 17 00:00:00 2001 From: Tim 'mithro' Ansell Date: Fri, 16 Dec 2016 15:59:26 +0100 Subject: [PATCH 2/2] Allow CSRElement objects to be autocompleted. --- litex/soc/tools/remote/csr_builder.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/litex/soc/tools/remote/csr_builder.py b/litex/soc/tools/remote/csr_builder.py index fa170ea59..07edc61e2 100644 --- a/litex/soc/tools/remote/csr_builder.py +++ b/litex/soc/tools/remote/csr_builder.py @@ -3,11 +3,15 @@ import csv class CSRElements: def __init__(self, d): - self.d = d + self.__dict__.update(d) + + @property + def d(self): + return self.__dict__ def __getattr__(self, attr): try: - return self.__dict__['d'][attr] + return self.__dict__[attr] except KeyError: pass raise KeyError("No such element " + attr)