diff --git a/pdm.lock b/pdm.lock index 9fcb112..f0427a3 100644 --- a/pdm.lock +++ b/pdm.lock @@ -5,7 +5,7 @@ groups = ["default", "dev"] strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:fbfe1db54d73aa2641413610d5e62d87b02de247293e2af3cd53ee0c283318db" +content_hash = "sha256:70036fd7ee1fe6910ed441a5419d9194d1abc592cbf2f39deb1d7a8e77501d03" [[metadata.targets]] requires_python = "==3.12.*" @@ -39,6 +39,18 @@ dependencies = [ "amaranth<0.7,>=0.4", ] +[[package]] +name = "amaranth-soc" +version = "0.1a1.dev24" +requires_python = "~=3.9" +git = "https://github.com/amaranth-lang/amaranth-soc.git" +revision = "5c43cf58f15d9cd9c69ff83c97997708d386b2dc" +summary = "System on Chip toolkit for Amaranth HDL" +groups = ["default"] +dependencies = [ + "amaranth<0.6,>=0.5", +] + [[package]] name = "basedpyright" version = "1.18.0" diff --git a/pyproject.toml b/pyproject.toml index 20cfe75..2be7884 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,6 +8,7 @@ authors = [ dependencies = [ "amaranth>=0.5.1", "amaranth-boards @ git+https://github.com/amaranth-lang/amaranth-boards.git", + "amaranth-soc @ git+https://github.com/amaranth-lang/amaranth-soc.git", ] requires-python = "==3.12.*" readme = "README.md" diff --git a/src/groovylight/hub75.py b/src/groovylight/hub75.py index f620428..f2df5cb 100644 --- a/src/groovylight/hub75.py +++ b/src/groovylight/hub75.py @@ -316,11 +316,13 @@ class Hub75DataDriver(wiring.Component): return m + class Hub75Coordinator(wiring.Component): """A shared-control hub75 driver""" - def __init__(self, geom: DisplayGeometry): + def __init__(self, geom: DisplayGeometry, *, double_fetch=True): self.geom = geom + self.double_fetch = double_fetch super().__init__( { "hub75": Out(Hub75Ctrl(self.geom.n_strings)), @@ -340,12 +342,18 @@ class Hub75Coordinator(wiring.Component): donearr = [] startStrings = Signal(1) stringsDone = Signal(1) + bram_shape = Rgb888Layout if self.double_fetch else data.ArrayLayout(Rgb888Layout, 2) for idx, string in enumerate(self.geom.strings): - sb = SwapBuffer(depth=128, shape=data.ArrayLayout(Rgb888Layout, 2)) + mdepth = string.dimensions.length + if self.double_fetch: + mdepth = mdepth * 2 + sb = SwapBuffer(depth=mdepth, shape=bram_shape) bufs.append(sb) stringdriver = Hub75DataDriver( - string.dimensions.length, data_shape=Rgb888Layout, double_fetch=False + string.dimensions.length, + data_shape=Rgb888Layout, + double_fetch=self.double_fetch, ) strings.append(stringdriver) wiring.connect(m, sb.read_port, stringdriver.bram) diff --git a/src/groovylight/main.py b/src/groovylight/main.py index 3fb41e1..2276861 100644 --- a/src/groovylight/main.py +++ b/src/groovylight/main.py @@ -1,6 +1,7 @@ # main entry point for CLI applications. import logging +import os import argparse from groovylight.config import Config from groovylight.platforms.cxxrtl_sim import emit_cxxrtl @@ -19,9 +20,21 @@ def setup_logger(args): handler.setFormatter(formatter) root_logger.addHandler(handler) + if args.log_file is not None: + hdlr = logging.FileHandler(args.log_file) + hdlr.setFormatter(formatter) + root_logger.addHandler(formatter) + root_logger.setLevel(args.loglevel) +def dir_path(string): + if os.path.isdir(string): + return string + else: + raise NotADirectoryError(string) + + def main(): parser = argparse.ArgumentParser() @@ -42,6 +55,9 @@ def main(): type=argparse.FileType("w"), metavar="FILE", ) + parser.add_argument( + "-D", "--dump", help="Dump verilog to folder", type=dir_path, metavar="FOLDER" + ) parser.add_argument( "config", @@ -62,6 +78,10 @@ def main(): logger.info("Generating CXXRTL based graphical simulator.") emit_cxxrtl(conf) + elif conf.conf["hardware"]["type"] == "colorlight": + logger.debug("Generating colorlight code") + if args.dump: + logger.info(f"Dumping verilog to {args.dump}") if __name__ == "__main__": diff --git a/src/groovylight/platforms/cxxrtl_sim.py b/src/groovylight/platforms/cxxrtl_sim.py index e4cfe0f..508ef75 100644 --- a/src/groovylight/platforms/cxxrtl_sim.py +++ b/src/groovylight/platforms/cxxrtl_sim.py @@ -10,11 +10,13 @@ from amaranth.back import cxxrtl from amaranth import Module +from groovylight import hub75 + def emit_cxxrtl(config): m = Module() - - cxxrtl.convert(m) + m.submodules.coordinator = crd = hub75.Hub75Coordinator(config.geom) + cxxrtl.convert(m, ports=[])