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