diff --git a/Makefile b/Makefile index f842f115..f33ece58 100755 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ clean: rm -rf dist *.egg-info format: - find ./riocore/ ./tests/ ./bin/ -type f | grep ".py$$\|bin/" | xargs -r -l ruff format -q + find ./riocore/ ./tests/ -type f | grep ".py$$" | xargs -r -l ruff format -q check: find ./riocore/ ./bin/ -type f | grep ".py$$\|bin/" | xargs -r -l ruff check @@ -16,7 +16,7 @@ verilator: find ./riocore/ -type f | grep ".v$$" | xargs -r -l verilator --lint-only readmes: - PYTHONPATH=. bin/rio-plugininfo -g + PYTHONPATH=. python3 -m rio-plugininfo -g PYTHONPATH=. riocore/files/update_boards_and_toolchains_readme.py dist: @@ -30,7 +30,14 @@ pypi: clean dist pyvenv: clean dist python3 -m venv pyvenv - pyvenv/bin/python -m pip install -r requirements.txt - pyvenv/bin/python -m pip install dist/riocore* - pyvenv/bin/python bin/rio-generator Altera10M08Eval/config-test.json + . pyvenv/bin/activate; \ + pip install -r requirements.txt; \ + pip install dist/riocore*;\ + rio-generator Altera10M08Eval/config.json +devvenv: clean dist + python3 -m venv pyvenv + . pyvenv/bin/activate; \ + pip install -r requirements.txt; \ + pip install -e .; \ + rio-generator Altera10M08Eval/config.json \ No newline at end of file diff --git a/bin/rio-generator b/bin/rio-generator deleted file mode 100755 index d659dbd4..00000000 --- a/bin/rio-generator +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env python3 -# -# - -import argparse -import os - -import riocore - -riocore_path = os.path.dirname(riocore.__file__) - -parser = argparse.ArgumentParser() -parser.add_argument("config", help="json config file", nargs="?", type=str, default=None) -parser.add_argument("output", help="output directory", nargs="?", type=str, default=None) -parser.add_argument("--preview", "-p", help="generate preview / no pll config", default=False, action="store_true") -parser.add_argument("--build", "-b", help="build gateware", default=False, action="store_true") -parser.add_argument("--flash", "-f", help="flash gateware", default=False, action="store_true") -args = parser.parse_args() - -if args.config: - if args.config.endswith(".json"): - if os.path.isfile(args.config): - config_file = args.config - elif os.path.isfile(f"{riocore_path}/configs/{args.config}"): - config_file = f"{riocore_path}/configs/{args.config}" - else: - print(f"can not load: {args.config}") - exit(1) - print(f"loading: {config_file}") - project = riocore.Project(config_file, args.output) - project.generator(preview=args.preview) - - config_name = project.config.get("name") - - if args.build: - cmd = f"(cd Output/{config_name}/Gateware/ ; make clean all)" - print("") - print("running:") - print(f" {cmd}") - print("") - os.system(cmd) - if args.flash: - cmd = f"(cd Output/{config_name}/Gateware/ ; make load)" - print("") - print("running:") - print(f" {cmd}") - print("") - os.system(cmd) - - elif args.config.startswith("testbench:"): - plugin = args.config.split(":")[-1] - plugins = riocore.Plugins() - plugin_instance = plugins.load_plugin(plugin, {"type": plugin}, {"speed": 1000000, "jdata": {"clock": {"speed": 1000000}}}) - plugins.testbench_builder(plugin, plugin_instance) - - elif args.config.startswith("plugininfo:"): - plugin = args.config.split(":")[-1] - plugins = riocore.Plugins() - print(plugins.info(plugin)) - - elif args.config.startswith("pluginlist"): - plugin = args.config.split(":")[-1] - plugins = riocore.Plugins() - for line in plugins.list(): - print(line) diff --git a/bin/rio-plugininfo b/bin/rio-plugininfo deleted file mode 100755 index a974ac9c..00000000 --- a/bin/rio-plugininfo +++ /dev/null @@ -1,97 +0,0 @@ -#!/usr/bin/env python3 -# -# - -import argparse -import os - -import riocore - -riocore_path = os.path.dirname(riocore.__file__) - -parser = argparse.ArgumentParser() -parser.add_argument("--list", "-l", help="list all plugins", default=False, action="store_true") -parser.add_argument("--generate", "-g", help="generate readme files for all plugins", default=False, action="store_true") -parser.add_argument("plugin", help="plugin", nargs="?", type=str, default=None) -args = parser.parse_args() - -if args.list: - plugins = riocore.Plugins() - for plugin in plugins.list(): - plugins.load_plugins({"plugins": [{"type": plugin["name"]}]}) - - print("Interfaces:") - print("") - for plugin_instance in plugins.plugin_instances: - if plugin_instance.TYPE == "interface": - print(f" {plugin_instance.NAME:20s} {plugin_instance.INFO}") - print("") - - print("Expansions:") - print("") - for plugin_instance in plugins.plugin_instances: - if plugin_instance.TYPE == "expansion": - print(f" {plugin_instance.NAME:20s} {plugin_instance.INFO}") - print("") - - print("Joints:") - print("") - for plugin_instance in plugins.plugin_instances: - if plugin_instance.TYPE == "joint": - print(f" {plugin_instance.NAME:20s} {plugin_instance.INFO}") - print("") - - print("IO:") - print("") - for plugin_instance in plugins.plugin_instances: - if plugin_instance.TYPE == "io": - print(f" {plugin_instance.NAME:20s} {plugin_instance.INFO}") - print("") - -elif args.generate: - plugins = riocore.Plugins() - for plugin in plugins.list(): - filename = f"riocore/plugins/{plugin['name']}/README.md" - print(filename) - text = plugins.info(plugin["name"]) - open(filename, "w").write(text) - - filename = "PLUGINS.md" - print(filename) - text = [] - - text.append("# PLUGINS") - text.append("") - text.append("| Type | Name | Info | Image |") - text.append("| --- | :---: | --- | :---: |") - - for title, ptype in { - "Interfaces": "interface", - "Joints": "joint", - "IO": "io", - "FrameIO": "frameio", - "Expansions": "expansion", - }.items(): - # text.append(f"## {title}:") - # text.append("") - - for plugin_instance in plugins.plugin_instances: - if plugin_instance.TYPE == ptype: - image = "" - plugin_path = f"{riocore_path}/plugins/{plugin_instance.NAME}" - image_path = f"{plugin_path}/image.png" - if os.path.isfile(image_path): - image = f'' - - text.append(f"| {title} | [{plugin_instance.NAME}](riocore/plugins/{plugin_instance.NAME}/README.md) | {plugin_instance.INFO} | {image} |") - - title = "" - - text.append("") - - open(filename, "w").write("\n".join(text)) - - -elif args.plugin: - plugins = riocore.Plugins() - print(plugins.info(args.plugin)) diff --git a/riocore/__init__.py b/riocore/__init__.py old mode 100755 new mode 100644 diff --git a/riocore/apps/__init__.py b/riocore/apps/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/riocore/apps/rio_generator.py b/riocore/apps/rio_generator.py new file mode 100644 index 00000000..fab648e6 --- /dev/null +++ b/riocore/apps/rio_generator.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 +# +# + +import argparse +import os + +import riocore + +riocore_path = os.path.dirname(riocore.__file__) + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("config", help="json config file", nargs="?", type=str, default=None) + parser.add_argument("output", help="output directory", nargs="?", type=str, default=None) + parser.add_argument("--preview", "-p", help="generate preview / no pll config", default=False, action="store_true") + parser.add_argument("--build", "-b", help="build gateware", default=False, action="store_true") + parser.add_argument("--flash", "-f", help="flash gateware", default=False, action="store_true") + args = parser.parse_args() + + if args.config: + if args.config.endswith(".json"): + if os.path.isfile(args.config): + config_file = args.config + elif os.path.isfile(f"{riocore_path}/configs/{args.config}"): + config_file = f"{riocore_path}/configs/{args.config}" + else: + print(f"can not load: {args.config}") + exit(1) + print(f"loading: {config_file}") + project = riocore.Project(config_file, args.output) + project.generator(preview=args.preview) + + config_name = project.config.get("name") + + if args.build: + cmd = f"(cd Output/{config_name}/Gateware/ ; make clean all)" + print("") + print("running:") + print(f" {cmd}") + print("") + os.system(cmd) + if args.flash: + cmd = f"(cd Output/{config_name}/Gateware/ ; make load)" + print("") + print("running:") + print(f" {cmd}") + print("") + os.system(cmd) + + elif args.config.startswith("testbench:"): + plugin = args.config.split(":")[-1] + plugins = riocore.Plugins() + plugin_instance = plugins.load_plugin(plugin, {"type": plugin}, {"speed": 1000000, "jdata": {"clock": {"speed": 1000000}}}) + plugins.testbench_builder(plugin, plugin_instance) + + elif args.config.startswith("plugininfo:"): + plugin = args.config.split(":")[-1] + plugins = riocore.Plugins() + print(plugins.info(plugin)) + + elif args.config.startswith("pluginlist"): + plugin = args.config.split(":")[-1] + plugins = riocore.Plugins() + for line in plugins.list(): + print(line) + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/riocore/apps/rio_plugininfo.py b/riocore/apps/rio_plugininfo.py new file mode 100644 index 00000000..73e1e122 --- /dev/null +++ b/riocore/apps/rio_plugininfo.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +# +# + +import argparse +import os + +import riocore + +riocore_path = os.path.dirname(riocore.__file__) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--list", "-l", help="list all plugins", default=False, action="store_true") + parser.add_argument("--generate", "-g", help="generate readme files for all plugins", default=False, action="store_true") + parser.add_argument("plugin", help="plugin", nargs="?", type=str, default=None) + args = parser.parse_args() + + if args.list: + plugins = riocore.Plugins() + for plugin in plugins.list(): + plugins.load_plugins({"plugins": [{"type": plugin["name"]}]}) + + print("Interfaces:") + print("") + for plugin_instance in plugins.plugin_instances: + if plugin_instance.TYPE == "interface": + print(f" {plugin_instance.NAME:20s} {plugin_instance.INFO}") + print("") + + print("Expansions:") + print("") + for plugin_instance in plugins.plugin_instances: + if plugin_instance.TYPE == "expansion": + print(f" {plugin_instance.NAME:20s} {plugin_instance.INFO}") + print("") + + print("Joints:") + print("") + for plugin_instance in plugins.plugin_instances: + if plugin_instance.TYPE == "joint": + print(f" {plugin_instance.NAME:20s} {plugin_instance.INFO}") + print("") + + print("IO:") + print("") + for plugin_instance in plugins.plugin_instances: + if plugin_instance.TYPE == "io": + print(f" {plugin_instance.NAME:20s} {plugin_instance.INFO}") + print("") + + elif args.generate: + plugins = riocore.Plugins() + for plugin in plugins.list(): + filename = f"riocore/plugins/{plugin['name']}/README.md" + print(filename) + text = plugins.info(plugin["name"]) + open(filename, "w").write(text) + + filename = "PLUGINS.md" + print(filename) + text = [] + + text.append("# PLUGINS") + text.append("") + text.append("| Type | Name | Info | Image |") + text.append("| --- | :---: | --- | :---: |") + + for title, ptype in { + "Interfaces": "interface", + "Joints": "joint", + "IO": "io", + "FrameIO": "frameio", + "Expansions": "expansion", + }.items(): + # text.append(f"## {title}:") + # text.append("") + + for plugin_instance in plugins.plugin_instances: + if plugin_instance.TYPE == ptype: + image = "" + plugin_path = f"{riocore_path}/plugins/{plugin_instance.NAME}" + image_path = f"{plugin_path}/image.png" + if os.path.isfile(image_path): + image = f'' + + text.append(f"| {title} | [{plugin_instance.NAME}](riocore/plugins/{plugin_instance.NAME}/README.md) | {plugin_instance.INFO} | {image} |") + + title = "" + + text.append("") + + open(filename, "w").write("\n".join(text)) + + + elif args.plugin: + plugins = riocore.Plugins() + print(plugins.info(args.plugin)) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/bin/rio-setup b/riocore/apps/rio_setup.py old mode 100755 new mode 100644 similarity index 99% rename from bin/rio-setup rename to riocore/apps/rio_setup.py index 55548fd8..6691560a --- a/bin/rio-setup +++ b/riocore/apps/rio_setup.py @@ -1641,11 +1641,11 @@ def get_boardpath(self, board): exit(1) def testgui(self): - print("starting testgui..", f"{os.path.dirname(__file__)}/rio-test") + testgui_path = f"{riocore_path}/apps/rio_test.py" + print("starting testgui..", testgui_path) filename = f"{self.config_file}.test-gui-temp.json" self.save_config(filename) - testgui_path = f"{os.path.dirname(__file__)}/rio-test" - os.system(f"({testgui_path} {filename} ; rm {filename}) &") + os.system(f"(python3 -m rio-test {filename} ; rm {filename}) &") def add_plugin(self, pin_id, slot_name=None): boardcfg = self.config.get("boardcfg") @@ -3355,10 +3355,10 @@ def generate(self, output_path=None, preview=False): try: if preview: open(f"{self.config_file}_tmp.json", "w").write(json.dumps(config, indent=4)) - os.system(f"{riocore_path}/../bin/rio-generator -p {self.config_file}_tmp.json {output_path} >/dev/null") + os.system(f"python3 -m rio-generator -p {self.config_file}_tmp.json {output_path} >/dev/null") os.system(f"rm {self.config_file}_tmp.json") else: - os.system(f"{riocore_path}/../bin/rio-generator {self.config_file} {output_path}") + os.system(f"python3 -m rio-generator {self.config_file} {output_path}") self.check_status() except Exception as error: print(f"ERROR generating output: {error}") @@ -3454,7 +3454,7 @@ def pin_edit_cb(self, widget): self.tabs["Json"].update() -if __name__ == "__main__": +def main(): app = QApplication(sys.argv) parser = argparse.ArgumentParser() @@ -3468,3 +3468,7 @@ def pin_edit_cb(self, widget): form = WinForm(args) form.show() sys.exit(app.exec_()) + + +if __name__ == "__main__": + main() diff --git a/bin/rio-test b/riocore/apps/rio_test.py old mode 100755 new mode 100644 similarity index 99% rename from bin/rio-test rename to riocore/apps/rio_test.py index 49118aa4..66671763 --- a/bin/rio-test +++ b/riocore/apps/rio_test.py @@ -525,8 +525,12 @@ def runTimer(self): print(traceback.format_exc()) -if __name__ == "__main__": +def main(): app = QApplication(sys.argv) form = WinForm() form.show() sys.exit(app.exec_()) + + +if __name__ == "__main__": + main() diff --git a/setup.py b/setup.py index 5cf5f590..b224e5e9 100644 --- a/setup.py +++ b/setup.py @@ -1,15 +1,13 @@ #!/usr/bin/env python3 -# -# + import glob import os -from setuptools import setup +from setuptools import setup, find_packages from riocore.VERSION import VERSION -scripts = [] package_data = { "riocore": [ "files/*", @@ -19,17 +17,14 @@ "configs/*/*", ], } -packages = ["riocore"] - -for script in glob.glob("bin/*"): - scripts.append(script) +#packages = ["riocore"] for folder in ("riocore/plugins/*", "riocore/generator/*", "riocore/generator/pins/*", "riocore/generator/toolchains/*", "riocore/interfaces/*"): - packages.append(folder.replace("/*", "").replace("/", ".")) + #packages.append(folder.replace("/*", "").replace("/", ".")) for module in glob.glob(folder): if "__" not in module and not module.endswith(".py"): module_name = module.replace("/", ".") - packages.append(module_name) + #packages.append(module_name) package_data[module_name] = ["*.c", "*.v", "*.png", "*.md"] setup( @@ -37,13 +32,22 @@ version=VERSION, author="Oliver Dippel", author_email="o.dippel@gmx.de", - packages=packages, + packages=find_packages(), package_data=package_data, - scripts=scripts, url="https://github.com/multigcs/riocore/", license="LICENSE", description="riocore", long_description=open("README.md").read(), + entry_points={ + 'gui_scripts': [ + 'rio-setup=riocore.apps.rio_setup:main', + 'rio-test=riocore.apps.rio_test:main', + ], + 'console_scripts': [ + 'rio-generator=riocore.apps.rio_generator:main', + 'rio-plugininfo=riocore.apps.rio_plugininfo:main', + ], + }, install_requires=["PyQt5>=5.15", "graphviz>=0.20", "pyqtgraph>=0.13.3"], include_package_data=True, )