diff --git a/artiq/gateware/remote_csr.py b/artiq/gateware/remote_csr.py new file mode 100644 index 000000000..32644b8f9 --- /dev/null +++ b/artiq/gateware/remote_csr.py @@ -0,0 +1,40 @@ +from collections import OrderedDict +from operator import itemgetter +import csv + +from misoc.interconnect.csr import CSRStatus, CSRStorage + + +def _get_csr_data(csv_file): + csr_data = OrderedDict() + with open(csv_file) as csv_file_f: + csv_reader = csv.reader(csv_file_f) + for name, address, length, ro in csv_reader: + region_name, csr_name = name.split(".") + address = int(address, 0) + length = int(length, 0) + ro = ro == "ro" + if region_name not in csr_data: + csr_data[region_name] = [] + csr_data[region_name].append((csr_name, address, length, ro)) + return csr_data + + +def get_remote_csr_regions(offset, csv_file): + regions = [] + for region_name, csrs_info in _get_csr_data(csv_file).items(): + csrs_info = sorted(csrs_info, key=itemgetter(1)) + origin = csrs_info[0][1] + next_address = origin + csrs = [] + for csr_name, address, length, ro in csrs_info: + if address != next_address: + raise ValueError("CSRs are not contiguous") + next_address += 4*length + if ro: + csr = CSRStatus(32*length, name=csr_name) + else: + csr = CSRStorage(32*length, name=csr_name) + csrs.append(csr) + regions.append((region_name, offset + origin, 32, csrs)) + return regions diff --git a/artiq/gateware/targets/sayma_amc_standalone.py b/artiq/gateware/targets/sayma_amc_standalone.py index b30e92853..836db203e 100755 --- a/artiq/gateware/targets/sayma_amc_standalone.py +++ b/artiq/gateware/targets/sayma_amc_standalone.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 import argparse +import os from migen import * @@ -12,6 +13,7 @@ from misoc.targets.sayma_amc import MiniSoC from artiq.gateware.amp import AMPSoC, build_artiq_soc from artiq.gateware import serwb +from artiq.gateware import remote_csr from artiq.gateware import rtio from artiq.gateware.rtio.phy import ttl_simple from artiq import __version__ as artiq_version @@ -20,9 +22,9 @@ from artiq import __version__ as artiq_version class SaymaAMCStandalone(MiniSoC, AMPSoC): mem_map = { "cri_con": 0x10000000, - "rtio": 0x20000000, - "rtio_dma": 0x30000000, - "serwb": 0x20000000, + "rtio": 0x11000000, + "rtio_dma": 0x12000000, + "serwb": 0x13000000, "mailbox": 0x70000000 } mem_map.update(MiniSoC.mem_map) @@ -156,9 +158,19 @@ def main(): description="ARTIQ device binary builder / Sayma AMC stand-alone") builder_args(parser) soc_sdram_args(parser) + parser.add_argument("--rtm-csr-csv", + default=os.path.join("artiq_sayma_rtm", "sayma_rtm_csr.csv"), + help="CSV file listing remote CSRs on RTM (default: %(default)s)") args = parser.parse_args() soc = SaymaAMCStandalone(**soc_sdram_argdict(args)) + + remote_csr_regions = remote_csr.get_remote_csr_regions( + soc.mem_map["serwb"] | soc.shadow_base, + args.rtm_csr_csv) + for name, origin, busword, csrs in remote_csr_regions: + soc.add_csr_region(name, origin, busword, csrs) + build_artiq_soc(soc, builder_argdict(args))