diff --git a/openhls/ir/memref.py b/openhls/ir/memref.py index 716b230..9fba2ff 100644 --- a/openhls/ir/memref.py +++ b/openhls/ir/memref.py @@ -1,3 +1,4 @@ +import sys from dataclasses import dataclass from typing import Tuple @@ -81,9 +82,18 @@ def reduce_add(self): def reduce_max(self): return ReduceMax(list(self.registers.flatten())) - def alias(self, other_memref): + def alias(self, other_memref, offsets=None, sizes=None, strides=None): assert isinstance(other_memref, MemRef) - self.registers = other_memref.registers + if offsets is not None and sizes is not None and strides is not None: + subview = [] + for o, si, st in zip(offsets, sizes, strides): + subview.append(slice(o, o + si, st)) + print("subview", subview, file=sys.stderr) + print("before subview", self.registers.shape, file=sys.stderr) + self.registers = other_memref.registers[tuple(subview)] + print("aftier subview", self.registers.shape, file=sys.stderr) + else: + self.registers = other_memref.registers class GlobalMemRef: diff --git a/openhls_translate/EmitHLSPy.cpp b/openhls_translate/EmitHLSPy.cpp index cd2e459..cb05b74 100644 --- a/openhls_translate/EmitHLSPy.cpp +++ b/openhls_translate/EmitHLSPy.cpp @@ -233,6 +233,7 @@ class ModuleEmitter : public OpenHLSEmitterBase { void emitLoad(memref::LoadOp op); void emitStore(memref::StoreOp op); void emitMemCpy(memref::CopyOp op); + void emitMemSubview(memref::SubViewOp op); void emitGlobal(memref::GlobalOp op); void emitGetGlobal(memref::GetGlobalOp op); void emitTensorStore(memref::TensorStoreOp op); @@ -420,6 +421,7 @@ class StmtVisitor : public HLSVisitorBase { bool visitOp(memref::StoreOp op) { return emitter.emitStore(op), true; } bool visitOp(memref::DeallocOp op) { return true; } bool visitOp(memref::CopyOp op) { return emitter.emitMemCpy(op), true; } + bool visitOp(memref::SubViewOp op) { return emitter.emitMemSubview(op), true; } bool visitOp(memref::GlobalOp op) { return emitter.emitGlobal(op), true; } bool visitOp(memref::GetGlobalOp op) { return emitter.emitGetGlobal(op), true; @@ -1169,20 +1171,23 @@ void ModuleEmitter::emitStore(memref::StoreOp op) { } void ModuleEmitter::emitMemCpy(memref::CopyOp op) { -// indent() << "memcpy("; indent() << ""; -// emitValue(op.target()); -// os << " = "; emitValue(op.target()); os << ".alias("; emitValue(op.getSource()); os << ")"; -// os << ", "; + os << "\n"; +} -// auto type = op.target().getType().cast(); -// os << type.getNumElements() << " * sizeof(" << getTypeName(op.target()) -// << "))"; -// os << "\n"; +void ModuleEmitter::emitMemSubview(memref::SubViewOp op) { + indent() << ""; + emitValue(op.result()); + os << ".alias("; + emitValue(op.getSource()); + os << ", offsets=" << op.getStaticOffsets(); + os << ", sizes=" << op.getStaticSizes(); + os << ", strides=" << op.getStaticStrides(); + os << ")"; os << "\n"; } diff --git a/openhls_translate/Visitor.h b/openhls_translate/Visitor.h index 05a2846..706d91f 100644 --- a/openhls_translate/Visitor.h +++ b/openhls_translate/Visitor.h @@ -40,7 +40,7 @@ class HLSVisitorBase { // Memref-related statements. memref::AllocOp, memref::AllocaOp, memref::LoadOp, memref::StoreOp, memref::GlobalOp, memref::GetGlobalOp, - memref::DeallocOp, memref::CopyOp, memref::TensorStoreOp, + memref::DeallocOp, memref::CopyOp, memref::SubViewOp, memref::TensorStoreOp, tensor::ReshapeOp, memref::ReshapeOp, memref::CollapseShapeOp, memref::ExpandShapeOp, memref::ReinterpretCastOp, bufferization::ToMemrefOp, bufferization::ToTensorOp, @@ -132,6 +132,7 @@ class HLSVisitorBase { HANDLE(memref::GetGlobalOp); HANDLE(memref::DeallocOp); HANDLE(memref::CopyOp); + HANDLE(memref::SubViewOp); HANDLE(memref::TensorStoreOp); HANDLE(tensor::ReshapeOp); HANDLE(memref::ReshapeOp); diff --git a/pyproject.toml b/pyproject.toml index 82bb229..07aa8f9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ requires = [ "setuptools>=42", "wheel", - "cmake==3.21", + "cmake>=3.24", # MLIR build depends. "ninja", "numpy==1.23.1", diff --git a/scripts/build.sh b/scripts/build.sh index a77f10d..8ebbfc0 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -32,6 +32,7 @@ if [ ! -f "${OPENHLS_DIR}"/build/llvm/CMakeCache.txt ]; then -DCMAKE_BUILD_TYPE=DEBUG \ -DMLIR_ENABLE_BINDINGS_PYTHON=ON \ -DLLVM_TARGETS_TO_BUILD=host \ + -DPython3_FIND_VIRTUALENV=ONLY \ -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ -S "${OPENHLS_DIR}"/externals/llvm-project/llvm \ -B "${OPENHLS_DIR}"/build/llvm @@ -137,7 +138,7 @@ if [ ! -f "${OPENHLS_DIR}"/build/flopoco_converter/CMakeCache.txt ]; then -DMLIR_ENABLE_BINDINGS_PYTHON=ON \ -DLLVM_TARGETS_TO_BUILD=host \ -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ - -S "${OPENHLS_DIR}"/flopoco_convert_ext \ + -S "${OPENHLS_DIR}"/extensions/flopoco_convert_ext \ -B "${OPENHLS_DIR}"/build/flopoco_converter fi @@ -154,15 +155,4 @@ if [ ! -f "${OPENHLS_DIR}"/build/ghdl/bin/ghdl ]; then mkdir -p "${OPENHLS_DIR}"/build/ghdl tar -xvf ghdl-gha-ubuntu-20.04-llvm.tgz -C "${OPENHLS_DIR}"/build/ghdl fi -fi - - -# TODO -#PYBIND11_DIR=${PREFIX}/lib/python3.10/site-packages/pybind11/share/cmake/ -#PYBIND11_DIR=$(python -c "import pybind11; print(pybind11.get_cmake_dir())") -#-DPYTHON_LIBRARY="/Users/mlevental/miniforge3/envs/openhls/lib/libpython3.10.dylib" -DPYTHON_INCLUDE_DIR="/Users/mlevental/miniforge3/envs/openhls/include/python3.10" \ - -# -DPYTHON_INCLUDE_DIR="$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())")" \ -# -DPYTHON_LIBRARY="$(python -c "import distutils.sysconfig as sysconfig; print(sysconfig.get_config_var('LIBDIR'))")" \ - -#-Dpybind11_DIR=/home/mlevental/miniconda3/envs/openhls/lib/python3.10/site-packages/pybind11/share/cmake/pybind11 -DPython_EXECUTABLE=/home/mlevental/miniconda3/envs/openhls/bin/python \ No newline at end of file +fi \ No newline at end of file diff --git a/setup.py b/setup.py index 60b4f3b..323566e 100644 --- a/setup.py +++ b/setup.py @@ -129,14 +129,6 @@ def build_torch_mlir(base_cmake_args): ) -def install_torch_mlir_from_wheel(): - torch_mlir_wheel = get_latest_torch_mlir() - subprocess.check_call( - [sys.executable, "-m", "pip", "install", torch_mlir_wheel], - cwd=CWD, - ) - - def build_circt(base_cmake_args): circt_dir = os.path.join(EXTERNALS, "circt") circt_build_dir = os.path.join(ROOT_BUILD_DIR, "circt") @@ -168,6 +160,7 @@ def build_openhls_translate(base_cmake_args): f'-DMLIR_DIR={os.path.join(LLVM_BUILD_DIR, "lib", "cmake", "mlir")}', f'-DLLVM_DIR={os.path.join(LLVM_BUILD_DIR, "lib", "cmake", "llvm")}', "-DMLIR_ENABLE_BINDINGS_PYTHON=ON", + "-DLLVM_ENABLE_ABI_BREAKING_CHECKS=OFF" f"-Dpybind11_DIR={pybind11.get_cmake_dir()}", ] run_cmake(openhls_dir, cmake_args, openhls_build_dir, target="openhls_translate")