From 5d70463d10392288caee1d9e253740687a407777 Mon Sep 17 00:00:00 2001 From: Felix Goding <felgo673@student.liu.se> Date: Tue, 18 Feb 2020 11:46:08 +0100 Subject: [PATCH 01/10] Added bash file to build all python files --- build.sh | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 build.sh diff --git a/build.sh b/build.sh new file mode 100644 index 00000000..aebc1105 --- /dev/null +++ b/build.sh @@ -0,0 +1,5 @@ +#! bin/sh +for n in `find . -name "*.py"` +do + python $n +done \ No newline at end of file -- GitLab From a66fa7f4f7068bd5400f837532dfe95b9fd824e0 Mon Sep 17 00:00:00 2001 From: Felix Goding <felgo673@student.liu.se> Date: Tue, 18 Feb 2020 11:52:33 +0100 Subject: [PATCH 02/10] Update .gitlab-ci.yml --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2130f26d..6c51653c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,4 +7,4 @@ PythonBuild: untracked: true script: - apt-get update && apt-get install python3 -y - - python3 helloworld.py \ No newline at end of file + - bash build.sh \ No newline at end of file -- GitLab From f0370cfdb98d9222d29745599a2b4841cea4f314 Mon Sep 17 00:00:00 2001 From: Felix Goding <felgo673@student.liu.se> Date: Tue, 18 Feb 2020 11:58:38 +0100 Subject: [PATCH 03/10] Update build.sh --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index aebc1105..1015ced2 100644 --- a/build.sh +++ b/build.sh @@ -1,5 +1,5 @@ #! bin/sh for n in `find . -name "*.py"` do - python $n + python3 $n done \ No newline at end of file -- GitLab From baa39a3cb90392ea57e524db540de67cfa790209 Mon Sep 17 00:00:00 2001 From: Felix Goding <felgo673@student.liu.se> Date: Tue, 18 Feb 2020 12:05:12 +0100 Subject: [PATCH 04/10] Update .gitlab-ci.yml -- GitLab From 6cc4b9697a1b3dea84787ee17838abf399b6dac5 Mon Sep 17 00:00:00 2001 From: Felix Goding <felgo673@student.liu.se> Date: Tue, 18 Feb 2020 12:09:43 +0100 Subject: [PATCH 05/10] Added a python file to test that pipeline can build python files correctly --- testbuild.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 testbuild.py diff --git a/testbuild.py b/testbuild.py new file mode 100644 index 00000000..48f3864f --- /dev/null +++ b/testbuild.py @@ -0,0 +1 @@ +print("Worked to build this file") \ No newline at end of file -- GitLab From 7b263393b2a51b24f16f31fa02302c58cf6e72fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivar=20H=C3=A4rnqvist?= <ivarhar@outlook.com> Date: Wed, 19 Feb 2020 21:49:22 +0100 Subject: [PATCH 06/10] add gitignore --- .gitignore | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100755 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100755 index 00000000..bf81ea19 --- /dev/null +++ b/.gitignore @@ -0,0 +1,28 @@ +.vs/ +.vscode/ +build*/ +bin*/ +logs/ +CMakeLists.txt.user* +*.autosave +*.creator +*.creator.user* +\#*\# +/.emacs.desktop +/.emacs.desktop.lock +*.elc +auto-save-list +tramp +.\#* +*~ +.fuse_hudden* +.directory +.Trash-* +.nfs* +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db +$RECYCLE.BIN/ +*.stackdump +[Dd]esktop.ini \ No newline at end of file -- GitLab From 1b46d8f122474d2e110b19f23c27bbd7641778df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivar=20H=C3=A4rnqvist?= <ivarhar@outlook.com> Date: Thu, 20 Feb 2020 20:46:36 +0100 Subject: [PATCH 07/10] add readme, logo, CMakeLists, setup boilerplate and example code --- .gitignore | 4 ++- .gitlab-ci.yml | 10 ------ CMakeLists.txt | 77 ++++++++++++++++++++++++++++++++++++++++++ LICENSE | 0 MANIFEST.in | 3 ++ README.md | 82 +++++++++++++++++++++++++++++++++++++++++++-- b_asic/__init__.py | 6 ++++ build.sh | 5 --- helloworld.py | 1 - logo.png | Bin 0 -> 70697 bytes setup.py | 75 +++++++++++++++++++++++++++++++++++++++++ src/main.cpp | 21 ++++++++++++ testbuild.py | 1 - 13 files changed, 264 insertions(+), 21 deletions(-) delete mode 100644 .gitlab-ci.yml create mode 100755 CMakeLists.txt mode change 100644 => 100755 LICENSE create mode 100755 MANIFEST.in mode change 100644 => 100755 README.md create mode 100755 b_asic/__init__.py delete mode 100644 build.sh delete mode 100644 helloworld.py create mode 100755 logo.png create mode 100755 setup.py create mode 100755 src/main.cpp delete mode 100644 testbuild.py diff --git a/.gitignore b/.gitignore index bf81ea19..473e0e34 100755 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ build*/ bin*/ logs/ +dist/ CMakeLists.txt.user* *.autosave *.creator @@ -25,4 +26,5 @@ ehthumbs.db ehthumbs_vista.db $RECYCLE.BIN/ *.stackdump -[Dd]esktop.ini \ No newline at end of file +[Dd]esktop.ini +*.egg-info \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 6c51653c..00000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,10 +0,0 @@ -stages: - - build - -PythonBuild: - stage: build - artifacts: - untracked: true - script: - - apt-get update && apt-get install python3 -y - - bash build.sh \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100755 index 00000000..6b6dafb3 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,77 @@ +cmake_minimum_required(VERSION 3.8) + +project( + "B-ASIC" + VERSION 0.0.1 + DESCRIPTION "Better ASIC Toolbox for python3" + LANGUAGES C CXX +) + +find_package(fmt 6.1.2 REQUIRED) +find_package(pybind11 CONFIG REQUIRED) + +set(LIBRARY_NAME "b_asic") +set(TARGET_NAME "_${LIBRARY_NAME}") +if(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY) + include(GNUInstallDirs) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_INSTALL_LIBDIR}") +endif() + +add_library( + "${TARGET_NAME}" MODULE + "${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp" +) +add_library( + "${TARGET_NAME}:${TARGET_NAME}" + ALIAS "${TARGET_NAME}" +) + +set_target_properties( + "${TARGET_NAME}" + PROPERTIES + PREFIX "" +) + +target_include_directories( + "${TARGET_NAME}" + PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}/src" +) + +target_compile_features( + "${TARGET_NAME}" + PRIVATE + cxx_std_17 +) +target_compile_options( + "${TARGET_NAME}" + PRIVATE + $<$<OR:$<CXX_COMPILER_ID:GNU>,$<CXX_COMPILER_ID:Clang>>: + -W -Wall -Wextra -Werror -Wno-psabi -fvisibility=hidden + $<$<CONFIG:Debug>:-g> + $<$<NOT:$<CONFIG:Debug>>:-O3> + > + $<$<CXX_COMPILER_ID:MSVC>: + /W3 /WX /permissive- /utf-8 + $<$<CONFIG:Debug>:/Od> + $<$<NOT:$<CONFIG:Debug>>:/Ot> + > +) + +target_link_libraries( + "${TARGET_NAME}" + PRIVATE + fmt::fmt-header-only + pybind11::module +) + +add_custom_target( + copy_python_files ALL + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_LIST_DIR}/${LIBRARY_NAME}" "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" + COMMENT "Copying python files to ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" +) +add_custom_target( + copy_misc_files ALL + COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_LIST_DIR}/README.md" "${CMAKE_CURRENT_LIST_DIR}/LICENSE" "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" + COMMENT "Copying misc. files to ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" +) \ No newline at end of file diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100755 index 00000000..89a500ee --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,3 @@ +include README.md +include LICENSE +recursive-include src *.cpp *.h diff --git a/README.md b/README.md old mode 100644 new mode 100755 index f126999b..78df523e --- a/README.md +++ b/README.md @@ -1,3 +1,79 @@ -<img src="https://files.slack.com/files-pri/TSHPRJY83-FTTRW9MQ8/b-asic-logo-opaque.png" width="318" height="100"> -<br> -<h3>The leading company in circuit design<h3> \ No newline at end of file +<img src="logo.png" width="278" height="100"> + +# B-ASIC - Better ASIC Toolbox +B-ASIC is an ASIC toolbox for Python 3 that simplifies circuit design and optimization. + +## Prerequisites +The following packages are required in order to build the library: +* cmake 3.8+ + * gcc 7+/clang 7+/msvc 16+ + * fmtlib 6.1.2+ + * pybind11 2.3.0+ +* python 3.6+ + * setuptools + * wheel + * pybind11 + +## Development +How to build and debug the library during development. + +### Using CMake directly +How to build using CMake. + +#### Configuring +In `B-ASIC`: +``` +mkdir build +cd build +cmake .. +``` + +#### Building (Debug) +In `B-ASIC/build`: +``` +cmake --build . +``` +The output gets written to `B-ASIC/build/lib`. + +#### Building (Release) +In `B-ASIC/build`: +``` +cmake --build . --config Release +``` +The output gets written to `B-ASIC/build/lib`. + +### Using setuptools to create a package +How to create a package using setuptools. + +#### Setup (Binary distribution) +In `B-ASIC`: +``` +python3 setup.py bdist_wheel +``` +The output gets written to `B-ASIC/dist`. + +#### Setup (Source distribution) +In `B-ASIC`: +``` +python3 setup.py sdist +``` +The output gets written to `B-ASIC/dist`. + +## Usage +How to build and use the library as a user. + +### Installation +``` +python3 -m pip install b_asic +``` + +### Importing +``` +python3 +>>> import b_asic as asic +>>> help(asic) +``` + +## License +B-ASIC is distributed under the MIT license. +See the included LICENSE file for more information. \ No newline at end of file diff --git a/b_asic/__init__.py b/b_asic/__init__.py new file mode 100755 index 00000000..598e2cbf --- /dev/null +++ b/b_asic/__init__.py @@ -0,0 +1,6 @@ +"""Better ASIC Toolbox""" +from _b_asic import * + +def mul(a, b): + """A function that multiplies two numbers""" + return a * b diff --git a/build.sh b/build.sh deleted file mode 100644 index 1015ced2..00000000 --- a/build.sh +++ /dev/null @@ -1,5 +0,0 @@ -#! bin/sh -for n in `find . -name "*.py"` -do - python3 $n -done \ No newline at end of file diff --git a/helloworld.py b/helloworld.py deleted file mode 100644 index 6d95fe97..00000000 --- a/helloworld.py +++ /dev/null @@ -1 +0,0 @@ -print("Hello world") \ No newline at end of file diff --git a/logo.png b/logo.png new file mode 100755 index 0000000000000000000000000000000000000000..b1bd78fe7eb8a737ac8153576078d61492c2e9a3 GIT binary patch literal 70697 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	UE(^A93S)> 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 literal 0 HcmV?d00001 diff --git a/setup.py b/setup.py new file mode 100755 index 00000000..aa6d7a6c --- /dev/null +++ b/setup.py @@ -0,0 +1,75 @@ +import os +import sys +import shutil +import subprocess +import setuptools +from setuptools import Extension +from setuptools.command.build_ext import build_ext + +CMAKE_EXE = os.environ.get('CMAKE_EXE', shutil.which('cmake')) + +class CMakeExtension(Extension): + def __init__(self, name, sourcedir = ""): + super().__init__(name, sources=[]) + self.sourcedir = os.path.abspath(sourcedir) + +class CMakeBuild(build_ext): + def build_extension(self, ext): + if not isinstance(ext, CMakeExtension): + return super().build_extension(ext) + + if not CMAKE_EXE: + raise RuntimeError(f"Cannot build extension {ext.name}: CMake executable not found! Set the CMAKE_EXE environment variable or update your path.") + + cmake_build_type = "Debug" if self.debug else "Release" + cmake_output_dir = os.path.abspath(os.path.dirname(self.get_ext_fullpath(ext.name))) + cmake_configure_argv = [ + CMAKE_EXE, ext.sourcedir, + "-DCMAKE_BUILD_TYPE=" + cmake_build_type, + "-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=" + cmake_output_dir, + "-DPYTHON_EXECUTABLE=" + sys.executable, + ] + cmake_build_argv = [ + CMAKE_EXE, "--build", ".", + "--config", cmake_build_type + ] + + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + + env = os.environ.copy() + + print(f"=== Configuring {ext.name} ===") + print(f"Temp dir: {self.build_temp}") + print(f"Output dir: {cmake_output_dir}") + subprocess.check_call(cmake_configure_argv, cwd=self.build_temp, env=env) + + print(f"=== Building {ext.name} ===") + print(f"Temp dir: {self.build_temp}") + print(f"Output dir: {cmake_output_dir}") + print(f"Build type: {cmake_build_type}") + subprocess.check_call(cmake_build_argv, cwd=self.build_temp, env=env) + + print() + +setuptools.setup( + name = "b-asic", + version = "0.0.1", + author = "Adam Jakobsson, Angus Lothian, Arvid Westerlund, Felix Goding, Ivar Härnqvist, Jacob Wahlman, Kevin Scott, Rasmus Karlsson", + author_email = "adaja901@student.liu.se, anglo547@student.liu.se, arvwe160@student.liu.se, felgo673@student.liu.se, ivaha717@student.liu.se, jacwa448@student.liu.se, kevsc634@student.liu.se, raska119@student.liu.se", + description = "Better ASIC Toolbox", + long_description = open("README.md", "r").read(), + long_description_content_type = "text/markdown", + url = "https://gitlab.liu.se/PUM_TDDD96/B-ASIC", + classifiers = [ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + ], + python_requires = ">=3.6", + install_requires = ["pybind11>=2.3.0"], + packages = ["b_asic"], + ext_modules = [CMakeExtension("b_asic")], + cmdclass = {"build_ext": CMakeBuild}, + zip_safe = False +) \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp new file mode 100755 index 00000000..c3184d1b --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,21 @@ +#include <pybind11/pybind11.h> + +namespace py = pybind11; + +namespace asic { + +int add(int a, int b) { + return a + b; +} + +int sub(int a, int b) { + return a - b; +} + +} // namespace asic + +PYBIND11_MODULE(_b_asic, m) { + m.doc() = "Better ASIC Toolbox Extension Module"; + m.def("add", &asic::add, "A function which adds two numbers", py::arg("a"), py::arg("b")); + m.def("sub", &asic::sub, "A function which subtracts two numbers", py::arg("a"), py::arg("b")); +} \ No newline at end of file diff --git a/testbuild.py b/testbuild.py deleted file mode 100644 index 48f3864f..00000000 --- a/testbuild.py +++ /dev/null @@ -1 +0,0 @@ -print("Worked to build this file") \ No newline at end of file -- GitLab From 0e74e6a625e15d652d48f512323053f9306cbaaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivar=20H=C3=A4rnqvist?= <ivarhar@outlook.com> Date: Thu, 20 Feb 2020 20:55:45 +0100 Subject: [PATCH 08/10] fix CMake python file copy destination --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6b6dafb3..7f6908ed 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -67,8 +67,8 @@ target_link_libraries( add_custom_target( copy_python_files ALL - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_LIST_DIR}/${LIBRARY_NAME}" "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" - COMMENT "Copying python files to ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_LIST_DIR}/${LIBRARY_NAME}" "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${LIBRARY_NAME}" + COMMENT "Copying python files to ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${LIBRARY_NAME}" ) add_custom_target( copy_misc_files ALL -- GitLab From dce323929a2c467ec1ab6383d6850dd2410d1604 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivar=20H=C3=A4rnqvist?= <ivarhar@outlook.com> Date: Fri, 21 Feb 2020 00:45:57 +0100 Subject: [PATCH 09/10] add python system shell --- b_asic/__init__.py | 17 ++-- b_asic/operation.py | 210 +++++++++++++++++++++++++++++++++++++++++++ b_asic/ops.py | 75 ++++++++++++++++ b_asic/pc.py | 24 +++++ b_asic/port.py | 147 ++++++++++++++++++++++++++++++ b_asic/schema.py | 24 +++++ b_asic/sfg.py | 37 ++++++++ b_asic/signal.py | 68 ++++++++++++++ b_asic/simulation.py | 42 +++++++++ src/main.cpp | 6 +- 10 files changed, 642 insertions(+), 8 deletions(-) create mode 100755 b_asic/operation.py create mode 100755 b_asic/ops.py create mode 100755 b_asic/pc.py create mode 100755 b_asic/port.py create mode 100755 b_asic/schema.py create mode 100755 b_asic/sfg.py create mode 100755 b_asic/signal.py create mode 100755 b_asic/simulation.py diff --git a/b_asic/__init__.py b/b_asic/__init__.py index 598e2cbf..8bbc17ab 100755 --- a/b_asic/__init__.py +++ b/b_asic/__init__.py @@ -1,6 +1,13 @@ -"""Better ASIC Toolbox""" +""" +Better ASIC Toolbox. +TODO: More info. +""" from _b_asic import * - -def mul(a, b): - """A function that multiplies two numbers""" - return a * b +from b_asic.operation import * +from b_asic.ops import * +from b_asic.pc import * +from b_asic.port import * +from b_asic.schema import * +from b_asic.sfg import * +from b_asic.signal import * +from b_asic.simulation import * \ No newline at end of file diff --git a/b_asic/operation.py b/b_asic/operation.py new file mode 100755 index 00000000..4bea5047 --- /dev/null +++ b/b_asic/operation.py @@ -0,0 +1,210 @@ +""" +B-ASIC Operation Module. +TODO: More info. +""" +from b_asic.port import InputPort, OutputPort +from b_asic.signal import SignalSource, SignalDestination +from b_asic.simulation import SimulationState, OperationState +from abc import ABC, abstractmethod +from numbers import Number +from typing import NewType, List, Dict, Optional, final + +OperationId = NewType("OperationId", int) + +class Operation(ABC): + """ + Operation interface. + TODO: More info. + """ + + @abstractmethod + def identifier(self) -> OperationId: + """ + Get the unique identifier. + """ + pass + + @abstractmethod + def inputs(self) -> List[InputPort]: + """ + Get a list of all input ports. + """ + pass + + @abstractmethod + def outputs(self) -> List[OutputPort]: + """ + Get a list of all output ports. + """ + pass + + @abstractmethod + def input_count(self) -> int: + """ + Get the number of input ports. + """ + pass + + @abstractmethod + def output_count(self) -> int: + """ + Get the number of output ports. + """ + pass + + @abstractmethod + def input(self, i: int) -> InputPort: + """ + Get the input port at index i. + """ + pass + + @abstractmethod + def output(self, i: int) -> OutputPort: + """ + Get the output port at index i. + """ + pass + + @abstractmethod + def params(self) -> Dict[str, Optional[Any]]: + """ + Get a dictionary of all parameter values. + """ + pass + + @abstractmethod + def param(self, name: str) -> Optional[Any]: + """ + Get the value of a parameter. + Returns None if the parameter is not defined. + """ + pass + + @abstractmethod + def set_param(self, name: str, value: Any) -> None: + """ + Set the value of a parameter. + The parameter must be defined. + """ + pass + + @abstractmethod + def evaluate_outputs(self, state: SimulationState) -> List[Number]: + """ + Simulate the circuit until its iteration count matches that of the simulation state, + then return the resulting output vector. + """ + pass + + @abstractmethod + def split(self) -> List[Operation]: + """ + Split the operation into multiple operations. + If splitting is not possible, this may return a list containing only the operation itself. + """ + pass + + # TODO: More stuff. + +class BasicOperation(ABC, Operation): + """ + Generic abstract operation class which most implementations will derive from. + TODO: More info. + """ + + _identifier: OperationId + _input_ports: List[InputPort] + _output_ports: List[OutputPort] + _parameters: Dict[str, Optional[Any]] + + def __init__(self, identifier: OperationId): + """ + Construct a BasicOperation. + """ + self._identifier = identifier + self._input_ports = [] + self._output_ports = [] + self._parameters = {} + + @abstractmethod + def evaluate(self, inputs: list) -> list: + """ + Evaluate the operation and generate a list of output values given a list of input values. + """ + pass + + @final + def id(self) -> OperationId: + return self._identifier + + @final + def inputs(self) -> List[InputPort]: + return self._input_ports.copy() + + @final + def outputs(self) -> List[OutputPort]: + return self._output_ports.copy() + + @final + def input_count(self) -> int: + return len(self._input_ports) + + @final + def output_count(self) -> int: + return len(self._output_ports) + + @final + def input(self, i: int) -> InputPort: + return self._input_ports[i] + + @final + def output(self, i: int) -> OutputPort: + return self._output_ports[i] + + @final + def params(self) -> Dict[str, Optional[Any]]: + return self._parameters.copy() + + @final + def param(self, name: str) -> Optional[Any]: + return self._parameters.get(name) + + @final + def set_param(self, name: str, value: Any) -> None: + assert name in self._parameters # TODO: Error message. + self._parameters[name] = value + + def evaluate_outputs(self, state: SimulationState) -> List[Number]: + # TODO: Check implementation. + input_count: int = self.input_count() + output_count: int = self.output_count() + assert input_count == len(self._input_ports) # TODO: Error message. + assert output_count == len(self._output_ports) # TODO: Error message. + + self_state: OperationState = state.operation_states[self.identifier()] + + while self_state.iteration < state.iteration: + input_values: List[Number] = [0] * input_count + for i in range(input_count): + source: SignalSource = self._input_ports[i].signal().source + input_values[i] = source.operation.evaluate_outputs(state)[source.port_index] + + self_state.output_values = self.evaluate(input_values) + assert len(self_state.output_values) == output_count # TODO: Error message. + self_state.iteration += 1 + for i in range(output_count): + for signal in self._output_ports[i].signals(): + destination: SignalDestination = signal.destination + destination.evaluate_outputs(state) + + return self_state.output_values + + def split(self) -> List[Operation]: + # TODO: Check implementation. + results = self.evaluate(self._input_ports) + if all(isinstance(e, Operation) for e in results): + return results + return [self] + + # TODO: More stuff. \ No newline at end of file diff --git a/b_asic/ops.py b/b_asic/ops.py new file mode 100755 index 00000000..6b370725 --- /dev/null +++ b/b_asic/ops.py @@ -0,0 +1,75 @@ +""" +B-ASIC Core Operations Module. +TODO: More info. +""" + +from b_asic.operation import OperationId, Operation, BasicOperation +from numbers import Number +from typing import final + +class Input(Operation): + """ + Input operation. + TODO: More info. + """ + + # TODO: Implement. + pass + +class Constant(BasicOperation): + """ + Constant value operation. + TODO: More info. + """ + + def __init__(self, identifier: OperationId, value: Number): + """ + Construct a Constant. + """ + super().__init__(identifier) + self._output_ports = [OutputPort()] # TODO: Generate appropriate ID for ports. + self._parameters["value"] = value + + @final + def evaluate(self, inputs: list) -> list: + return [self.param("value")] + +class Addition(BasicOperation): + """ + Binary addition operation. + TODO: More info. + """ + + def __init__(self, identifier: OperationId): + """ + Construct an Addition. + """ + super().__init__(identifier) + self._input_ports = [InputPort(), InputPort()] # TODO: Generate appropriate ID for ports. + self._output_ports = [OutputPort()] # TODO: Generate appropriate ID for ports. + + @final + def evaluate(self, inputs: list) -> list: + return [inputs[0] + inputs[1]] + + +class ConstantMultiplication(BasicOperation): + """ + Unary constant multiplication operation. + TODO: More info. + """ + + def __init__(self, identifier: OperationId, coefficient: Number): + """ + Construct a ConstantMultiplication. + """ + super().__init__(identifier) + self._input_ports = [InputPort()] # TODO: Generate appropriate ID for ports. + self._output_ports = [OutputPort()] # TODO: Generate appropriate ID for ports. + self._parameters["coefficient"] = coefficient + + @final + def evaluate(self, inputs: list) -> list: + return [inputs[0] * self.param("coefficient")] + +# TODO: More operations. \ No newline at end of file diff --git a/b_asic/pc.py b/b_asic/pc.py new file mode 100755 index 00000000..cc18d6af --- /dev/null +++ b/b_asic/pc.py @@ -0,0 +1,24 @@ +""" +B-ASIC Precedence Chart Module. +TODO: More info. +""" + +from b_asic.sfg import SFG + +class PrecedenceChart: + """ + Precedence chart constructed from a signal flow graph. + TODO: More info. + """ + + sfg: SFG + # TODO: More members. + + def __init__(self, sfg: SFG): + """ + Construct a PrecedenceChart. + """ + self.sfg = sfg + # TODO: Implement. + + # TODO: More stuff. \ No newline at end of file diff --git a/b_asic/port.py b/b_asic/port.py new file mode 100755 index 00000000..6b1e8d20 --- /dev/null +++ b/b_asic/port.py @@ -0,0 +1,147 @@ +""" +B-ASIC Port Module. +TODO: More info. +""" + +from b_asic.signal import Signal +from abc import ABC, abstractmethod +from typing import NewType, Optional, List, Dict, final + +PortId = NewType("PortId", int) + +class Port(ABC): + """ + Abstract port class. + TODO: More info. + """ + + _identifier: PortId + + def __init__(self, identifier: PortId): + """ + Construct a Port. + """ + self._identifier = identifier + + @final + def identifier(self) -> PortId: + """ + Get the unique identifier. + """ + return self._identifier + + @abstractmethod + def signals(self) -> List[Signal]: + """ + Get a list of all connected signals. + """ + pass + + @abstractmethod + def signal_count(self) -> int: + """ + Get the number of connected signals. + """ + pass + + @abstractmethod + def signal(self, i: int = 0) -> Signal: + """ + Get the connected signal at index i. + """ + pass + + @abstractmethod + def connect(self, signal: Signal) -> None: + """ + Connect a signal. + """ + pass + + @abstractmethod + def disconnect(self, i: int = 0) -> None: + """ + Disconnect a signal. + """ + pass + + # TODO: More stuff. + +class InputPort(Port): + """ + Input port. + TODO: More info. + """ + _source_signal: Optional[Signal] + + def __init__(self, identifier: PortId): + """ + Construct an InputPort. + """ + super().__init__(identifier) + self._source_signal = None + + @final + def signals(self) -> List[Signal]: + return [] if self._source_signal == None else [self._source_signal] + + @final + def signal_count(self) -> int: + return 0 if self._source_signal == None else 1 + + @final + def signal(self, i: int = 0) -> Signal: + assert i >= 0 and i < self.signal_count() # TODO: Error message. + assert self._source_signal != None # TODO: Error message. + return self._source_signal + + @final + def connect(self, signal: Signal) -> None: + self._source_signal = signal + + @final + def disconnect(self, i: int = 0) -> None: + assert i >= 0 and i < self.signal_count() # TODO: Error message. + self._source_signal = None + + # TODO: More stuff. + +class OutputPort(Port): + """ + Output port. + TODO: More info. + """ + + _destination_signals: List[Signal] + + def __init__(self, identifier: PortId): + """ + Construct an OutputPort. + """ + super().__init__(identifier) + self._destination_signals = [] + + @final + def signals(self) -> List[Signal]: + return self._destination_signals.copy() + + @final + def signal_count(self) -> int: + return len(self._destination_signals) + + @final + def signal(self, i: int = 0) -> Signal: + assert i >= 0 and i < self.signal_count() # TODO: Error message. + return self._destination_signals[i] + + @final + def connect(self, signal: Signal) -> None: + assert signal not in self._destination_signals # TODO: Error message. + self._destination_signals.append(signal) + + @final + def disconnect(self, i: int = 0) -> None: + assert i >= 0 and i < self.signal_count() # TODO: Error message. + del self._destination_signals[i] + + # TODO: More stuff. \ No newline at end of file diff --git a/b_asic/schema.py b/b_asic/schema.py new file mode 100755 index 00000000..a7642f49 --- /dev/null +++ b/b_asic/schema.py @@ -0,0 +1,24 @@ +""" +B-ASIC Schema Module. +TODO: More info. +""" + +from b_asic.pc import PrecedenceChart + +class Schema: + """ + Schema constructed from a precedence chart. + TODO: More info. + """ + + pc: PrecedenceChart + # TODO: More members. + + def __init__(self, pc: PrecedenceChart): + """ + Construct a Schema. + """ + self.pc = pc + # TODO: Implement. + + # TODO: More stuff. \ No newline at end of file diff --git a/b_asic/sfg.py b/b_asic/sfg.py new file mode 100755 index 00000000..d39cc524 --- /dev/null +++ b/b_asic/sfg.py @@ -0,0 +1,37 @@ +""" +B-ASIC Signal Flow Graph Module. +TODO: More info. +""" + +from b_asic.operation import OperationId, Operation, BasicOperation +from b_asic.signal import SignalSource, SignalDestination +from b_asic.simulation import SimulationState, OperationState +from typing import List, final + +class SFG(BasicOperation): + """ + Signal flow graph. + TODO: More info. + """ + + _operations: List[Operation] + + def __init__(self, identifier: OperationId, input_destinations: List[SignalDestination], output_sources: List[SignalSource]): + """ + Construct a SFG. + """ + super().__init__(identifier) + # TODO: Allocate input/output ports with appropriate IDs. + self._operations = [] + # TODO: Traverse the graph between the inputs/outputs and add to self._operations. + # TODO: Connect ports with signals with appropriate IDs. + + @final + def evaluate(self, inputs: list) -> list: + return [] # TODO: Implement + + @final + def split(self) -> List[Operation]: + return self._operations + + # TODO: More stuff. \ No newline at end of file diff --git a/b_asic/signal.py b/b_asic/signal.py new file mode 100755 index 00000000..36be9f58 --- /dev/null +++ b/b_asic/signal.py @@ -0,0 +1,68 @@ +""" +B-ASIC Signal Module. +TODO: More info. +""" + +from b_asic.operation import Operation +from typing import NewType + +SignalId = NewType("SignalId", int) + +class SignalSource: + """ + Handle to a signal source. + TODO: More info. + """ + operation: Operation + port_index: int + + def __init__(self, operation: Operation, port_index: int): + """ + Construct a SignalSource. + """ + self.operation = operation + self.port_index = port_index + + # TODO: More stuff. + +class SignalDestination: + """ + Handle to a signal destination. + TODO: More info. + """ + operation: Operation + port_index: int + + def __init__(self, operation: Operation, port_index: int): + """ + Construct a SignalDestination. + """ + self.operation = operation + self.port_index = port_index + + # TODO: More stuff. + +class Signal: + """ + A connection between two operations consisting of a source and destination handle. + TODO: More info. + """ + _identifier: SignalId + source: SignalSource + destination: SignalDestination + + def __init__(self, identifier: SignalId, source: SignalSource, destination: SignalDestination): + """ + Construct a Signal. + """ + self._identifier = identifier + self.source = source + self.destination = destination + + def identifier(self) -> SignalId: + """ + Get the unique identifier. + """ + return self._identifier + + # TODO: More stuff. \ No newline at end of file diff --git a/b_asic/simulation.py b/b_asic/simulation.py new file mode 100755 index 00000000..aa33cb33 --- /dev/null +++ b/b_asic/simulation.py @@ -0,0 +1,42 @@ +""" +B-ASIC Simulation Module. +TODO: More info. +""" + +from b_asic.operation import OperationId +from numbers import Number +from typing import List, Dict + +class OperationState: + """ + Simulation state of an operation. + TODO: More info. + """ + + output_values: List[Number] + iteration: int + + def __init__(self): + """ + Construct an OperationState. + """ + self.output_values = [] + self.iteration = 0 + +class SimulationState: + """ + Simulation state. + TODO: More info. + """ + + operation_states: Dict[OperationId, OperationState] + iteration: int + + def __init__(self): + """ + Construct a SimulationState. + """ + self.operation_states = {} + self.iteration = 0 + + # TODO: More stuff. \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index c3184d1b..75a77ef5 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -15,7 +15,7 @@ int sub(int a, int b) { } // namespace asic PYBIND11_MODULE(_b_asic, m) { - m.doc() = "Better ASIC Toolbox Extension Module"; - m.def("add", &asic::add, "A function which adds two numbers", py::arg("a"), py::arg("b")); - m.def("sub", &asic::sub, "A function which subtracts two numbers", py::arg("a"), py::arg("b")); + m.doc() = "Better ASIC Toolbox Extension Module."; + m.def("add", &asic::add, "A function which adds two numbers.", py::arg("a"), py::arg("b")); + m.def("sub", &asic::sub, "A function which subtracts two numbers.", py::arg("a"), py::arg("b")); } \ No newline at end of file -- GitLab From 613e90981a08500a1215f80a98ae7b8dcf34d7b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivar=20H=C3=A4rnqvist?= <ivaha717@student.liu.se> Date: Mon, 24 Feb 2020 10:20:44 +0100 Subject: [PATCH 10/10] fix sdist by adding CMakeLists.txt to manifest, update README.md --- .gitignore | 0 CMakeLists.txt | 0 LICENSE | 0 MANIFEST.in | 1 + README.md | 12 ++++++++++++ b_asic/__init__.py | 0 b_asic/operation.py | 0 b_asic/ops.py | 0 b_asic/pc.py | 0 b_asic/port.py | 0 b_asic/schema.py | 0 b_asic/sfg.py | 0 b_asic/signal.py | 0 b_asic/simulation.py | 0 logo.png | Bin setup.py | 0 src/main.cpp | 0 17 files changed, 13 insertions(+) mode change 100755 => 100644 .gitignore mode change 100755 => 100644 CMakeLists.txt mode change 100755 => 100644 LICENSE mode change 100755 => 100644 MANIFEST.in mode change 100755 => 100644 README.md mode change 100755 => 100644 b_asic/__init__.py mode change 100755 => 100644 b_asic/operation.py mode change 100755 => 100644 b_asic/ops.py mode change 100755 => 100644 b_asic/pc.py mode change 100755 => 100644 b_asic/port.py mode change 100755 => 100644 b_asic/schema.py mode change 100755 => 100644 b_asic/sfg.py mode change 100755 => 100644 b_asic/signal.py mode change 100755 => 100644 b_asic/simulation.py mode change 100755 => 100644 logo.png mode change 100755 => 100644 setup.py mode change 100755 => 100644 src/main.cpp diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 diff --git a/CMakeLists.txt b/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/LICENSE b/LICENSE old mode 100755 new mode 100644 diff --git a/MANIFEST.in b/MANIFEST.in old mode 100755 new mode 100644 index 89a500ee..ce996f6c --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,4 @@ include README.md include LICENSE +include CMakeLists.txt recursive-include src *.cpp *.h diff --git a/README.md b/README.md old mode 100755 new mode 100644 index 78df523e..4917b55e --- a/README.md +++ b/README.md @@ -59,6 +59,18 @@ python3 setup.py sdist ``` The output gets written to `B-ASIC/dist`. +#### Installation (Binary distribution) +In `B-ASIC`: +``` +python3 -m pip install b_asic-<version>-<cpver>-<cpver>_<arch>.whl +``` + +#### Installation (Source distribution) +In `B-ASIC`: +``` +python3 -m pip install b-asic-<version>.tar.gz +``` + ## Usage How to build and use the library as a user. diff --git a/b_asic/__init__.py b/b_asic/__init__.py old mode 100755 new mode 100644 diff --git a/b_asic/operation.py b/b_asic/operation.py old mode 100755 new mode 100644 diff --git a/b_asic/ops.py b/b_asic/ops.py old mode 100755 new mode 100644 diff --git a/b_asic/pc.py b/b_asic/pc.py old mode 100755 new mode 100644 diff --git a/b_asic/port.py b/b_asic/port.py old mode 100755 new mode 100644 diff --git a/b_asic/schema.py b/b_asic/schema.py old mode 100755 new mode 100644 diff --git a/b_asic/sfg.py b/b_asic/sfg.py old mode 100755 new mode 100644 diff --git a/b_asic/signal.py b/b_asic/signal.py old mode 100755 new mode 100644 diff --git a/b_asic/simulation.py b/b_asic/simulation.py old mode 100755 new mode 100644 diff --git a/logo.png b/logo.png old mode 100755 new mode 100644 diff --git a/setup.py b/setup.py old mode 100755 new mode 100644 diff --git a/src/main.cpp b/src/main.cpp old mode 100755 new mode 100644 -- GitLab