mirror of
https://github.com/YosysHQ/yosys
synced 2025-10-09 01:11:58 +00:00
pyosys: rewrite using pybind11
- Rewrite all Python features to use the pybind11 library instead of boost::python. Unlike boost::python, pybind11 is a header-only library that is just included by Pyosys code, saving a lot of compile time on wheels. - Factor out as much "translation" code from the generator into proper C++ files - Fix running the embedded interpreter not supporting "from pyosys import libyosys as ys" like wheels - Move Python-related elements to `pyosys` directory at the root of the repo - Slight shift in bridging semantics: - Containers are declared as "opaque types" and are passed by reference to Python - many methods have been implemented to make them feel right at home without the overhead/ambiguity of copying to Python and then copying back after mutation - Monitor/Pass use "trampoline" pattern to support virual methods overridable in Python: virtual methods no longer require `py_` prefix - Create really short test set for pyosys that just exercises basic functionality
This commit is contained in:
parent
f7120e9c2a
commit
88be728353
27 changed files with 2879 additions and 2674 deletions
43
setup.py
43
setup.py
|
@ -16,18 +16,19 @@ import os
|
|||
import re
|
||||
import shlex
|
||||
import shutil
|
||||
from pathlib import Path
|
||||
from setuptools import setup, Extension
|
||||
from setuptools.command.build_ext import build_ext
|
||||
|
||||
__dir__ = os.path.dirname(os.path.abspath(__file__))
|
||||
import pybind11
|
||||
from pybind11.setup_helpers import build_ext
|
||||
|
||||
__yosys_root__ = Path(__file__).parent
|
||||
|
||||
yosys_version_rx = re.compile(r"YOSYS_VER\s*:=\s*([\w\-\+\.]+)")
|
||||
|
||||
version = yosys_version_rx.search(
|
||||
open(os.path.join(__dir__, "Makefile"), encoding="utf8").read()
|
||||
)[1].replace(
|
||||
"+", "."
|
||||
) # Convert to patch version
|
||||
with open(__yosys_root__ / "Makefile", encoding="utf8") as f:
|
||||
# Extract and convert + to patch version
|
||||
version = yosys_version_rx.search(f.read())[1].replace("+", ".")
|
||||
|
||||
|
||||
class libyosys_so_ext(Extension):
|
||||
|
@ -38,7 +39,13 @@ class libyosys_so_ext(Extension):
|
|||
"libyosys.so",
|
||||
[],
|
||||
)
|
||||
|
||||
# when iterating locally, you probably want to set this variable
|
||||
# to avoid mass rebuilds bec of pybind11's include path changing
|
||||
pybind_include = os.getenv("_FORCE_PYBIND_INCLUDE", pybind11.get_include())
|
||||
|
||||
self.args = [
|
||||
f"PYBIND11_INCLUDE={pybind_include}",
|
||||
"ENABLE_PYOSYS=1",
|
||||
# Would need to be installed separately by the user
|
||||
"ENABLE_TCL=0",
|
||||
|
@ -73,22 +80,23 @@ class libyosys_so_ext(Extension):
|
|||
*self.args,
|
||||
]
|
||||
)
|
||||
build_path = os.path.dirname(os.path.dirname(bext.get_ext_fullpath(self.name)))
|
||||
pyosys_path = os.path.join(build_path, "pyosys")
|
||||
ext_fullpath = Path(bext.get_ext_fullpath(self.name))
|
||||
build_path = ext_fullpath.parents[1]
|
||||
pyosys_path = build_path / "pyosys"
|
||||
os.makedirs(pyosys_path, exist_ok=True)
|
||||
|
||||
# libyosys.so
|
||||
target = os.path.join(pyosys_path, os.path.basename(self.name))
|
||||
target = pyosys_path / self.name
|
||||
shutil.copy(self.name, target)
|
||||
bext.spawn(["strip", "-S", target])
|
||||
bext.spawn(["strip", "-S", str(target)])
|
||||
|
||||
# yosys-abc
|
||||
yosys_abc_target = os.path.join(pyosys_path, "yosys-abc")
|
||||
yosys_abc_target = pyosys_path / "yosys-abc"
|
||||
shutil.copy("yosys-abc", yosys_abc_target)
|
||||
bext.spawn(["strip", "-S", yosys_abc_target])
|
||||
bext.spawn(["strip", "-S", str(yosys_abc_target)])
|
||||
|
||||
# share directory
|
||||
share_target = os.path.join(pyosys_path, "share")
|
||||
share_target = pyosys_path / "share"
|
||||
try:
|
||||
shutil.rmtree(share_target)
|
||||
except FileNotFoundError:
|
||||
|
@ -104,14 +112,16 @@ class custom_build_ext(build_ext):
|
|||
return ext.custom_build(self)
|
||||
|
||||
|
||||
with open(__yosys_root__ / "README.md", encoding="utf8") as f:
|
||||
long_description = f.read()
|
||||
|
||||
setup(
|
||||
name="pyosys",
|
||||
packages=["pyosys"],
|
||||
version=version,
|
||||
description="Python access to libyosys",
|
||||
long_description=open(os.path.join(__dir__, "README.md")).read(),
|
||||
long_description=long_description,
|
||||
long_description_content_type="text/markdown",
|
||||
install_requires=["wheel", "setuptools"],
|
||||
license="MIT",
|
||||
classifiers=[
|
||||
"Programming Language :: Python :: 3",
|
||||
|
@ -119,7 +129,6 @@ setup(
|
|||
"Operating System :: POSIX :: Linux",
|
||||
"Operating System :: MacOS :: MacOS X",
|
||||
],
|
||||
package_dir={"pyosys": "misc"},
|
||||
python_requires=">=3.8",
|
||||
ext_modules=[libyosys_so_ext()],
|
||||
cmdclass={
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue