diff --git a/.gitignore b/.gitignore index 7361b6f02ac8204903e7aba33be205139fec6d76..6ebc1f5d11e2158e895383297863436b651309f1 100644 --- a/.gitignore +++ b/.gitignore @@ -32,4 +32,5 @@ __pycache__/ env/ venv/ *.pyd -*.so \ No newline at end of file +*.so +_b_asic_debug_log.txt \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index de055d3702d8feb9317477a1f61d5eb6171baaad..256d9973098f7681fb9c63602f8f9f0b614fa008 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,16 +3,18 @@ cmake_minimum_required(VERSION 3.8) project( "B-ASIC" VERSION 0.0.1 - DESCRIPTION "Better ASIC Toolbox for python3" + DESCRIPTION "Better ASIC Toolbox for Python 3" LANGUAGES C CXX ) +# Find dependencies. find_package(fmt 5.2.1 REQUIRED) find_package(pybind11 CONFIG REQUIRED) -set(LIBRARY_NAME "b_asic") -set(TARGET_NAME "_${LIBRARY_NAME}") +set(LIBRARY_NAME "b_asic") # Name of the python folder. +set(TARGET_NAME "_${LIBRARY_NAME}") # Name of this extension module. +# Set output directory for compiled binaries. if(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY) include(GNUInstallDirs) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_INSTALL_LIBDIR}") @@ -29,31 +31,42 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") +# Add files to be compiled into Python module. pybind11_add_module( "${TARGET_NAME}" + + # Main files. "${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/src/simulation.cpp" - #"${CMAKE_CURRENT_SOURCE_DIR}/src/simulation_oop/custom_operation.cpp" - #"${CMAKE_CURRENT_SOURCE_DIR}/src/simulation_oop/operation.cpp" - #"${CMAKE_CURRENT_SOURCE_DIR}/src/simulation_oop/signal_flow_graph.cpp" - #"${CMAKE_CURRENT_SOURCE_DIR}/src/simulation_oop/simulation.cpp" - #"${CMAKE_CURRENT_SOURCE_DIR}/src/simulation_oop/special_operations.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/src/simulation_dod/compile.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/src/simulation_dod/run.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/src/simulation_dod/simulation.cpp" + + # For DOD simulation. + "${CMAKE_CURRENT_SOURCE_DIR}/src/simulation/compile.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/simulation/run.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/simulation/simulation.cpp" + + # For OOP simulation (see legacy folder). + #"${CMAKE_CURRENT_SOURCE_DIR}/src/simulation/custom_operation.cpp" + #"${CMAKE_CURRENT_SOURCE_DIR}/src/simulation/operation.cpp" + #"${CMAKE_CURRENT_SOURCE_DIR}/src/simulation/signal_flow_graph.cpp" + #"${CMAKE_CURRENT_SOURCE_DIR}/src/simulation/simulation.cpp" + #"${CMAKE_CURRENT_SOURCE_DIR}/src/simulation/special_operations.cpp" ) +# Include headers. target_include_directories( "${TARGET_NAME}" PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src" ) +# Use C++17. target_compile_features( "${TARGET_NAME}" PRIVATE cxx_std_17 ) + +# Set compiler-specific options using generator expressions. target_compile_options( "${TARGET_NAME}" PRIVATE @@ -69,36 +82,28 @@ target_compile_options( > ) +# Add libraries. Note: pybind11 is already added in pybind11_add_module. target_link_libraries( "${TARGET_NAME}" PRIVATE fmt::fmt-header-only ) -if(BUILDING_PYTHON_DISTRIBUTION) - add_custom_target( - remove_old_python_dir ALL - COMMAND ${CMAKE_COMMAND} -E remove_directory "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${LIBRARY_NAME}" - COMMENT "Removing old python directory ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${LIBRARY_NAME}" - ) - add_custom_target( - copy_python_dir ALL - 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}" - DEPENDS "${TARGET_NAME}" remove_old_python_dir - ) -elseif(WIN32) - add_custom_target( - copy_binaries ALL - COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/_b_asic.cp38-win_amd64.pyd" "${CMAKE_CURRENT_LIST_DIR}" - COMMENT "Copying binaries to ${CMAKE_CURRENT_LIST_DIR}" - DEPENDS "${TARGET_NAME}" - ) -else() - add_custom_target( - copy_binaries ALL - COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/_b_asic.cpython-38-x86_64-linux-gnu.so" "${CMAKE_CURRENT_LIST_DIR}" - COMMENT "Copying binaries to ${CMAKE_CURRENT_LIST_DIR}" - DEPENDS "${TARGET_NAME}" - ) +# Copy binaries to project folder for debugging during development. +if(NOT ASIC_BUILDING_PYTHON_DISTRIBUTION) + if(WIN32) + add_custom_target( + copy_binaries ALL + COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/_b_asic.*.pyd" "${CMAKE_CURRENT_LIST_DIR}" + COMMENT "Copying binaries to ${CMAKE_CURRENT_LIST_DIR}" + DEPENDS "${TARGET_NAME}" + ) + else() + add_custom_target( + copy_binaries ALL + COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/_b_asic.*.so" "${CMAKE_CURRENT_LIST_DIR}" + COMMENT "Copying binaries to ${CMAKE_CURRENT_LIST_DIR}" + DEPENDS "${TARGET_NAME}" + ) + endif() endif() \ No newline at end of file diff --git a/b_asic_debug_log.txt b/b_asic_debug_log.txt deleted file mode 100644 index 66c2aa1aa760db285e5df29990947fcba3d7ec90..0000000000000000000000000000000000000000 --- a/b_asic_debug_log.txt +++ /dev/null @@ -1,102 +0,0 @@ -compile.cpp:160 : Compiling code... -compile.cpp:166 : Compiled code: -============================================== -> Code stats -============================================== -Input count: 2 -Output count: 1 -Instruction count: 9 -Required stack size: 3 -Delay count: 1 -Result count: 8 -Custom operation count: 0 -Custom source count: 0 -============================================== -> Delays -============================================== - 0: Initial value: 0.0, Result: 1: "t1" -============================================== -> Result keys -============================================== - 0: "0" - 1: "t1" - 2: "mul1" - 3: "add1" - 4: "in1" - 5: "sub1" - 6: "c1" - 7: "in2" -============================================== -> Instructions -============================================== - 0: push_result results[1] -> 1: "t1" - 1: push_input inputs[0] -> 4: "in1" - 2: addition -> 3: "add1" - 3: push_constant 1.0 -> 6: "c1" - 4: push_input inputs[1] -> 7: "in2" - 5: subtraction -> 5: "sub1" - 6: multiplication -> 2: "mul1" - 7: delay delays[0] -> 1: "t1" - 8: forward_value -> 0: "0" -============================================== - -simulation.cpp:70 : Running simulation iteration. -run.cpp:82 : Evaluating push_result! -run.cpp:78 : Evaluating push_input! -run.cpp:96 : Evaluating addition! -run.cpp:86 : Evaluating push_constant! -run.cpp:78 : Evaluating push_input! -run.cpp:100 : Evaluating subtraction! -run.cpp:104 : Evaluating multiplication! -run.cpp:148 : Evaluating delay! -run.cpp:168 : Evaluating forward_value! -simulation.cpp:70 : Running simulation iteration. -run.cpp:82 : Evaluating push_result! -run.cpp:78 : Evaluating push_input! -run.cpp:96 : Evaluating addition! -run.cpp:86 : Evaluating push_constant! -run.cpp:78 : Evaluating push_input! -run.cpp:100 : Evaluating subtraction! -run.cpp:104 : Evaluating multiplication! -run.cpp:148 : Evaluating delay! -run.cpp:168 : Evaluating forward_value! -simulation.cpp:70 : Running simulation iteration. -run.cpp:82 : Evaluating push_result! -run.cpp:78 : Evaluating push_input! -run.cpp:96 : Evaluating addition! -run.cpp:86 : Evaluating push_constant! -run.cpp:78 : Evaluating push_input! -run.cpp:100 : Evaluating subtraction! -run.cpp:104 : Evaluating multiplication! -run.cpp:148 : Evaluating delay! -run.cpp:168 : Evaluating forward_value! -simulation.cpp:70 : Running simulation iteration. -run.cpp:82 : Evaluating push_result! -run.cpp:78 : Evaluating push_input! -run.cpp:96 : Evaluating addition! -run.cpp:86 : Evaluating push_constant! -run.cpp:78 : Evaluating push_input! -run.cpp:100 : Evaluating subtraction! -run.cpp:104 : Evaluating multiplication! -run.cpp:148 : Evaluating delay! -run.cpp:168 : Evaluating forward_value! -simulation.cpp:70 : Running simulation iteration. -run.cpp:82 : Evaluating push_result! -run.cpp:78 : Evaluating push_input! -run.cpp:96 : Evaluating addition! -run.cpp:86 : Evaluating push_constant! -run.cpp:78 : Evaluating push_input! -run.cpp:100 : Evaluating subtraction! -run.cpp:104 : Evaluating multiplication! -run.cpp:148 : Evaluating delay! -run.cpp:168 : Evaluating forward_value! -simulation.cpp:70 : Running simulation iteration. -run.cpp:82 : Evaluating push_result! -run.cpp:78 : Evaluating push_input! -run.cpp:96 : Evaluating addition! -run.cpp:86 : Evaluating push_constant! -run.cpp:78 : Evaluating push_input! -run.cpp:100 : Evaluating subtraction! -run.cpp:104 : Evaluating multiplication! -run.cpp:148 : Evaluating delay! -run.cpp:168 : Evaluating forward_value! diff --git a/legacy/README.md b/legacy/README.md new file mode 100644 index 0000000000000000000000000000000000000000..746d1efdb57c04f4e52bb2ce7f0a7def99c744ed --- /dev/null +++ b/legacy/README.md @@ -0,0 +1,11 @@ +# Legacy files + +This folder contains currently unused code that is kept for acedemic purposes, +or to be used as a refererence for future development. + +## simulation_oop + +This folder contains a C++ implementation of the Simulation class designed +using Object-Oriented Programming, as opposed to the current version that uses +Data-Oriented Design. They are functionally identical, but use different +styles of programming and have different performance characteristics. \ No newline at end of file diff --git a/src/simulation_oop/core_operations.h b/legacy/simulation_oop/core_operations.h similarity index 93% rename from src/simulation_oop/core_operations.h rename to legacy/simulation_oop/core_operations.h index 8aa259d7678e2c14db4a5c7b3f1f8769afd1df14..ca871b7f7ea03d87d5e085e5581a1776b2964a57 100644 --- a/src/simulation_oop/core_operations.h +++ b/legacy/simulation_oop/core_operations.h @@ -25,7 +25,7 @@ public: private: [[nodiscard]] number evaluate_output_impl(std::size_t, result_map&, delay_map&, std::optional<std::size_t>, bool) const final { - ASIC_DEBUG_MSG("Evaluating constant!"); + ASIC_DEBUG_MSG("Evaluating constant."); return m_value; } @@ -43,7 +43,7 @@ public: private: [[nodiscard]] number evaluate_output_impl(std::size_t, result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, bool truncate) const final { - ASIC_DEBUG_MSG("Evaluating addition!"); + ASIC_DEBUG_MSG("Evaluating addition."); return this->evaluate_lhs(results, delays, bits_override, truncate) + this->evaluate_rhs(results, delays, bits_override, truncate); } }; @@ -59,7 +59,7 @@ public: private: [[nodiscard]] number evaluate_output_impl(std::size_t, result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, bool truncate) const final { - ASIC_DEBUG_MSG("Evaluating subtraction!"); + ASIC_DEBUG_MSG("Evaluating subtraction."); return this->evaluate_lhs(results, delays, bits_override, truncate) - this->evaluate_rhs(results, delays, bits_override, truncate); } }; @@ -75,7 +75,7 @@ public: private: [[nodiscard]] number evaluate_output_impl(std::size_t, result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, bool truncate) const final { - ASIC_DEBUG_MSG("Evaluating multiplication!"); + ASIC_DEBUG_MSG("Evaluating multiplication."); return this->evaluate_lhs(results, delays, bits_override, truncate) * this->evaluate_rhs(results, delays, bits_override, truncate); } }; @@ -91,7 +91,7 @@ public: private: [[nodiscard]] number evaluate_output_impl(std::size_t, result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, bool truncate) const final { - ASIC_DEBUG_MSG("Evaluating division!"); + ASIC_DEBUG_MSG("Evaluating division."); return this->evaluate_lhs(results, delays, bits_override, truncate) / this->evaluate_rhs(results, delays, bits_override, truncate); } }; @@ -107,7 +107,7 @@ public: private: [[nodiscard]] number evaluate_output_impl(std::size_t, result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, bool truncate) const final { - ASIC_DEBUG_MSG("Evaluating min!"); + ASIC_DEBUG_MSG("Evaluating min."); auto const lhs = this->evaluate_lhs(results, delays, bits_override, truncate); if (lhs.imag() != 0) { throw std::runtime_error{"Min does not support complex numbers."}; @@ -131,7 +131,7 @@ public: private: [[nodiscard]] number evaluate_output_impl(std::size_t, result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, bool truncate) const final { - ASIC_DEBUG_MSG("Evaluating max!"); + ASIC_DEBUG_MSG("Evaluating max."); auto const lhs = this->evaluate_lhs(results, delays, bits_override, truncate); if (lhs.imag() != 0) { throw std::runtime_error{"Max does not support complex numbers."}; @@ -155,7 +155,7 @@ public: private: [[nodiscard]] number evaluate_output_impl(std::size_t, result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, bool truncate) const final { - ASIC_DEBUG_MSG("Evaluating sqrt!"); + ASIC_DEBUG_MSG("Evaluating sqrt."); return std::sqrt(this->evaluate_input(results, delays, bits_override, truncate)); } }; @@ -171,7 +171,7 @@ public: private: [[nodiscard]] number evaluate_output_impl(std::size_t, result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, bool truncate) const final { - ASIC_DEBUG_MSG("Evaluating conj!"); + ASIC_DEBUG_MSG("Evaluating conj."); return std::conj(this->evaluate_input(results, delays, bits_override, truncate)); } }; @@ -187,7 +187,7 @@ public: private: [[nodiscard]] number evaluate_output_impl(std::size_t, result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, bool truncate) const final { - ASIC_DEBUG_MSG("Evaluating abs!"); + ASIC_DEBUG_MSG("Evaluating abs."); return std::abs(this->evaluate_input(results, delays, bits_override, truncate)); } }; @@ -204,7 +204,7 @@ public: private: [[nodiscard]] number evaluate_output_impl(std::size_t, result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, bool truncate) const final { - ASIC_DEBUG_MSG("Evaluating cmul!"); + ASIC_DEBUG_MSG("Evaluating cmul."); return this->evaluate_input(results, delays, bits_override, truncate) * m_value; } @@ -222,14 +222,12 @@ public: private: [[nodiscard]] number evaluate_output_impl(std::size_t index, result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, bool truncate) const final { - ASIC_DEBUG_MSG("Evaluating bfly!"); + ASIC_DEBUG_MSG("Evaluating bfly."); if (index == 0) { return this->evaluate_lhs(results, delays, bits_override, truncate) + this->evaluate_rhs(results, delays, bits_override, truncate); } return this->evaluate_lhs(results, delays, bits_override, truncate) - this->evaluate_rhs(results, delays, bits_override, truncate); } - - number m_value; }; } // namespace asic diff --git a/src/simulation_oop/custom_operation.cpp b/legacy/simulation_oop/custom_operation.cpp similarity index 85% rename from src/simulation_oop/custom_operation.cpp rename to legacy/simulation_oop/custom_operation.cpp index a0c546433bec0c34f326804591d71c866a1f905f..9308e0b6fc0e9836ba550c23c68e4d266a1a02cf 100644 --- a/src/simulation_oop/custom_operation.cpp +++ b/legacy/simulation_oop/custom_operation.cpp @@ -18,9 +18,7 @@ std::size_t custom_operation::output_count() const noexcept { number custom_operation::evaluate_output_impl(std::size_t index, result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, bool truncate) const { using namespace pybind11::literals; auto input_values = this->evaluate_inputs(results, delays, bits_override, truncate); - auto const value = m_evaluate_output(index, std::move(input_values), "truncate"_a = false).cast<number>(); - results[this->key_of_output(index)] = value; - return value; + return m_evaluate_output(index, std::move(input_values), "truncate"_a = false).cast<number>(); } number custom_operation::truncate_input(std::size_t index, number value, std::size_t bits) const { diff --git a/src/simulation_oop/custom_operation.h b/legacy/simulation_oop/custom_operation.h similarity index 100% rename from src/simulation_oop/custom_operation.h rename to legacy/simulation_oop/custom_operation.h diff --git a/src/simulation_oop/operation.cpp b/legacy/simulation_oop/operation.cpp similarity index 100% rename from src/simulation_oop/operation.cpp rename to legacy/simulation_oop/operation.cpp diff --git a/src/simulation_oop/operation.h b/legacy/simulation_oop/operation.h similarity index 80% rename from src/simulation_oop/operation.h rename to legacy/simulation_oop/operation.h index 577c53fb4d4fb4aca9ee2e3fd9d435c0a6ab4b68..152383104a1a954c0f5edebf7de5e9288341650e 100644 --- a/src/simulation_oop/operation.h +++ b/legacy/simulation_oop/operation.h @@ -9,10 +9,10 @@ #include <memory> #include <optional> #include <stdexcept> +#include <string> +#include <unordered_map> #include <utility> #include <vector> -#include <unordered_map> -#include <string> namespace asic { @@ -25,7 +25,8 @@ public: virtual ~operation() = default; [[nodiscard]] virtual std::size_t output_count() const noexcept = 0; [[nodiscard]] virtual std::optional<number> current_output(std::size_t index, delay_map const& delays) const = 0; - [[nodiscard]] virtual number evaluate_output(std::size_t index, result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, bool truncate) const = 0; + [[nodiscard]] virtual number evaluate_output(std::size_t index, result_map& results, delay_map& delays, + std::optional<std::size_t> bits_override, bool truncate) const = 0; }; class signal_source final { @@ -36,7 +37,8 @@ public: [[nodiscard]] explicit operator bool() const noexcept; [[nodiscard]] std::optional<number> current_output(delay_map const& delays) const; - [[nodiscard]] number evaluate_output(result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, bool truncate) const; + [[nodiscard]] number evaluate_output(result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, + bool truncate) const; [[nodiscard]] std::optional<std::size_t> bits() const noexcept; @@ -52,10 +54,12 @@ public: virtual ~abstract_operation() = default; [[nodiscard]] std::optional<number> current_output(std::size_t, delay_map const&) const override; - [[nodiscard]] number evaluate_output(std::size_t index, result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, bool truncate) const override; + [[nodiscard]] number evaluate_output(std::size_t index, result_map& results, delay_map& delays, + std::optional<std::size_t> bits_override, bool truncate) const override; protected: - [[nodiscard]] virtual number evaluate_output_impl(std::size_t index, result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, bool truncate) const = 0; + [[nodiscard]] virtual number evaluate_output_impl(std::size_t index, result_map& results, delay_map& delays, + std::optional<std::size_t> bits_override, bool truncate) const = 0; [[nodiscard]] virtual number truncate_input(std::size_t index, number value, std::size_t bits) const; [[nodiscard]] result_key const& key_base() const; @@ -75,7 +79,8 @@ public: protected: [[nodiscard]] bool connected() const noexcept; - [[nodiscard]] number evaluate_input(result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, bool truncate) const; + [[nodiscard]] number evaluate_input(result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, + bool truncate) const; private: signal_source m_in; @@ -89,8 +94,10 @@ public: void connect(signal_source lhs, signal_source rhs); protected: - [[nodiscard]] number evaluate_lhs(result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, bool truncate) const; - [[nodiscard]] number evaluate_rhs(result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, bool truncate) const; + [[nodiscard]] number evaluate_lhs(result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, + bool truncate) const; + [[nodiscard]] number evaluate_rhs(result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, + bool truncate) const; private: signal_source m_lhs; @@ -105,7 +112,8 @@ public: void connect(std::vector<signal_source> inputs); protected: - [[nodiscard]] std::vector<number> evaluate_inputs(result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, bool truncate) const; + [[nodiscard]] std::vector<number> evaluate_inputs(result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, + bool truncate) const; private: std::vector<signal_source> m_inputs; diff --git a/src/simulation_oop/signal_flow_graph.cpp b/legacy/simulation_oop/signal_flow_graph.cpp similarity index 100% rename from src/simulation_oop/signal_flow_graph.cpp rename to legacy/simulation_oop/signal_flow_graph.cpp diff --git a/src/simulation_oop/signal_flow_graph.h b/legacy/simulation_oop/signal_flow_graph.h similarity index 100% rename from src/simulation_oop/signal_flow_graph.h rename to legacy/simulation_oop/signal_flow_graph.h diff --git a/src/simulation_oop/simulation.cpp b/legacy/simulation_oop/simulation.cpp similarity index 100% rename from src/simulation_oop/simulation.cpp rename to legacy/simulation_oop/simulation.cpp diff --git a/src/simulation_oop/simulation.h b/legacy/simulation_oop/simulation.h similarity index 100% rename from src/simulation_oop/simulation.h rename to legacy/simulation_oop/simulation.h diff --git a/src/simulation_oop/special_operations.cpp b/legacy/simulation_oop/special_operations.cpp similarity index 95% rename from src/simulation_oop/special_operations.cpp rename to legacy/simulation_oop/special_operations.cpp index 907311ecc116822995dfe6a0f6bec7fcbf4ba07c..a4595471d08ababb54b7672a3781170aebcd55cf 100644 --- a/src/simulation_oop/special_operations.cpp +++ b/legacy/simulation_oop/special_operations.cpp @@ -19,7 +19,7 @@ void input_operation::value(number value) noexcept { } number input_operation::evaluate_output_impl(std::size_t, result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, bool truncate) const { - ASIC_DEBUG_MSG("Evaluating input!"); + ASIC_DEBUG_MSG("Evaluating input."); if (this->connected()) { return this->evaluate_input(results, delays, bits_override, truncate); } @@ -34,7 +34,7 @@ std::size_t output_operation::output_count() const noexcept { } number output_operation::evaluate_output_impl(std::size_t, result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, bool truncate) const { - ASIC_DEBUG_MSG("Evaluating output!"); + ASIC_DEBUG_MSG("Evaluating output."); return this->evaluate_input(results, delays, bits_override, truncate); } @@ -55,7 +55,7 @@ std::optional<number> delay_operation::current_output(std::size_t index, delay_m } number delay_operation::evaluate_output(std::size_t index, result_map& results, delay_map& delays, std::optional<std::size_t> bits_override, bool truncate) const { - ASIC_DEBUG_MSG("Evaluating delay!"); + ASIC_DEBUG_MSG("Evaluating delay."); ASIC_ASSERT(index == 0); auto const key = this->key_of_output(index); // Use a reference to avoid iterator invalidation by evaluate_input. diff --git a/src/simulation_oop/special_operations.h b/legacy/simulation_oop/special_operations.h similarity index 100% rename from src/simulation_oop/special_operations.h rename to legacy/simulation_oop/special_operations.h diff --git a/setup.py b/setup.py index ae922638ade61557330a5393138b6cb8d34f6968..f9d4cf7e6a6f8c5b2895e63da824bcb71994701d 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ import setuptools from setuptools import Extension from setuptools.command.build_ext import build_ext -CMAKE_EXE = os.environ.get('CMAKE_EXE', shutil.which('cmake')) +CMAKE_EXE = os.environ.get("CMAKE_EXE", shutil.which("cmake")) class CMakeExtension(Extension): def __init__(self, name, sourcedir = ""): @@ -25,7 +25,7 @@ class CMakeBuild(build_ext): cmake_output_dir = os.path.abspath(os.path.dirname(self.get_ext_fullpath(ext.name))) cmake_configure_argv = [ CMAKE_EXE, ext.sourcedir, - "-DBUILDING_PYTHON_DISTRIBUTION=true", + "-DASIC_BUILDING_PYTHON_DISTRIBUTION=true", "-DCMAKE_BUILD_TYPE=" + cmake_build_type, "-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=" + cmake_output_dir, "-DPYTHON_EXECUTABLE=" + sys.executable, @@ -78,4 +78,4 @@ setuptools.setup( ext_modules = [CMakeExtension("b_asic")], cmdclass = {"build_ext": CMakeBuild}, zip_safe = False -) \ No newline at end of file +) diff --git a/src/debug.h b/src/debug.h index cef9fdcb052fd77b4472abed0597a01c8f57b427..f1ad2d193d2021b6c54784bc1089c5f6c32aea96 100644 --- a/src/debug.h +++ b/src/debug.h @@ -31,11 +31,14 @@ #endif // ASIC_ENABLE_ASSERTS namespace asic { + +constexpr auto debug_log_filename = "_b_asic_debug_log.txt"; + namespace detail { #if ASIC_ENABLE_DEBUG_LOGGING inline void log_debug_msg_string(std::string_view file, int line, std::string_view string) { - static auto log_file = std::ofstream{"b_asic_debug_log.txt", std::ios::trunc}; + static auto log_file = std::ofstream{debug_log_filename, std::ios::trunc}; log_file << fmt::format("{:<40}: {}", fmt::format("{}:{}", std::filesystem::path{file}.filename().generic_string(), line), string) << std::endl; } diff --git a/src/simulation.cpp b/src/simulation.cpp index 5bdbb2d06d4acc16637d7ac463776dd79d73db38..33280f604be77614f7eadf1ad40d868177dd6e95 100644 --- a/src/simulation.cpp +++ b/src/simulation.cpp @@ -1,5 +1,5 @@ #include "simulation.h" -#include "simulation_dod/simulation.h" +#include "simulation/simulation.h" namespace py = pybind11; diff --git a/src/simulation_dod/compile.cpp b/src/simulation/compile.cpp similarity index 96% rename from src/simulation_dod/compile.cpp rename to src/simulation/compile.cpp index 19af408af5f3eccc74ebc6f838faa7852cdac7b9..c0c80480b79707f8267d3cfe4d414560a2a1fe02 100644 --- a/src/simulation_dod/compile.cpp +++ b/src/simulation/compile.cpp @@ -13,10 +13,10 @@ #include <optional> namespace py = pybind11; - + namespace asic { -[[nodiscard]] static std::string format_number(number const& value) { +[[maybe_unused]] [[nodiscard]] static std::string format_number(number const& value) { if (value.imag() == 0) { return fmt::to_string(value.real()); } @@ -29,7 +29,7 @@ namespace asic { return fmt::format("{}+{}j", value.real(), value.imag()); } -[[nodiscard]] static std::string format_compiled_simulation_code_result_keys(simulation_code const& code) { +[[maybe_unused]] [[nodiscard]] static std::string format_compiled_simulation_code_result_keys(simulation_code const& code) { auto result = std::string{}; for (auto const& [i, result_key] : enumerate(code.result_keys)) { result += fmt::format("{:>2}: \"{}\"\n", i, result_key); @@ -37,7 +37,7 @@ namespace asic { return result; } -[[nodiscard]] static std::string format_compiled_simulation_code_delays(simulation_code const& code) { +[[maybe_unused]] [[nodiscard]] static std::string format_compiled_simulation_code_delays(simulation_code const& code) { auto result = std::string{}; for (auto const& [i, delay] : enumerate(code.delays)) { ASIC_ASSERT(delay.result_index < code.result_keys.size()); @@ -46,7 +46,7 @@ namespace asic { return result; } -[[nodiscard]] static std::string format_compiled_simulation_code_instruction(instruction const& instruction) { +[[maybe_unused]] [[nodiscard]] static std::string format_compiled_simulation_code_instruction(instruction const& instruction) { switch (instruction.type) { case instruction_type::push_input: return fmt::format("push_input inputs[{}]", instruction.index); @@ -86,7 +86,7 @@ namespace asic { return std::string{}; } -[[nodiscard]] static std::string format_compiled_simulation_code_instructions(simulation_code const& code) { +[[maybe_unused]] [[nodiscard]] static std::string format_compiled_simulation_code_instructions(simulation_code const& code) { auto result = std::string{}; for (auto const& [i, instruction] : enumerate(code.instructions)) { auto instruction_string = format_compiled_simulation_code_instruction(instruction); diff --git a/src/simulation_dod/compile.h b/src/simulation/compile.h similarity index 100% rename from src/simulation_dod/compile.h rename to src/simulation/compile.h diff --git a/src/simulation_dod/instruction.h b/src/simulation/instruction.h similarity index 86% rename from src/simulation_dod/instruction.h rename to src/simulation/instruction.h index 3d3da8d4807050d80a148a13df20ab324f1c8858..60bed068827838b3fdd6f96cde16bb8455d56369 100644 --- a/src/simulation_dod/instruction.h +++ b/src/simulation/instruction.h @@ -23,9 +23,9 @@ enum class instruction_type : std::uint8_t { complex_conjugate, // push(conj(pop())) absolute, // push(abs(pop())) constant_multiplication, // push(pop() * value) - delay, // value = pop(); push(delays[index]); delays[index] = value - custom, - forward_value + delay, // auto const value = pop(); push(delays[index]); delays[index] = value + custom, // Custom operation. Uses custom_source[index]. + forward_value // Just forward the current value on the stack (i.e. do nothing). }; using result_index_t = std::uint16_t; diff --git a/src/simulation_dod/run.cpp b/src/simulation/run.cpp similarity index 88% rename from src/simulation_dod/run.cpp rename to src/simulation/run.cpp index deb56ac98a29b544cf58f86207dc5a59b71e6c2c..b9fa8edb7e6b7b0766cb87f019c396ede27459d4 100644 --- a/src/simulation_dod/run.cpp +++ b/src/simulation/run.cpp @@ -75,41 +75,41 @@ simulation_state run_simulation(simulation_code const& code, span<number const> // Execute the instruction. switch (instruction.type) { case instruction_type::push_input: - ASIC_DEBUG_MSG("Evaluating push_input!"); + ASIC_DEBUG_MSG("Evaluating push_input."); push(inputs[instruction.index]); break; case instruction_type::push_result: - ASIC_DEBUG_MSG("Evaluating push_result!"); + ASIC_DEBUG_MSG("Evaluating push_result."); push(state.results[instruction.index]); break; case instruction_type::push_constant: - ASIC_DEBUG_MSG("Evaluating push_constant!"); + ASIC_DEBUG_MSG("Evaluating push_constant."); push(instruction.value); break; case instruction_type::truncate: - ASIC_DEBUG_MSG("Evaluating truncate!"); + ASIC_DEBUG_MSG("Evaluating truncate."); if (truncate) { push(truncate_value(pop(), instruction.bit_mask)); } break; case instruction_type::addition: - ASIC_DEBUG_MSG("Evaluating addition!"); + ASIC_DEBUG_MSG("Evaluating addition."); push(pop() + pop()); break; case instruction_type::subtraction: - ASIC_DEBUG_MSG("Evaluating subtraction!"); + ASIC_DEBUG_MSG("Evaluating subtraction."); push(pop() - pop()); break; case instruction_type::multiplication: - ASIC_DEBUG_MSG("Evaluating multiplication!"); + ASIC_DEBUG_MSG("Evaluating multiplication."); push(pop() * pop()); break; case instruction_type::division: - ASIC_DEBUG_MSG("Evaluating division!"); + ASIC_DEBUG_MSG("Evaluating division."); push(pop() / pop()); break; case instruction_type::min: { - ASIC_DEBUG_MSG("Evaluating min!"); + ASIC_DEBUG_MSG("Evaluating min."); auto const lhs = pop(); auto const rhs = pop(); if (lhs.imag() != 0 || rhs.imag() != 0) { @@ -119,7 +119,7 @@ simulation_state run_simulation(simulation_code const& code, span<number const> break; } case instruction_type::max: { - ASIC_DEBUG_MSG("Evaluating max!"); + ASIC_DEBUG_MSG("Evaluating max."); auto const lhs = pop(); auto const rhs = pop(); if (lhs.imag() != 0 || rhs.imag() != 0) { @@ -129,30 +129,30 @@ simulation_state run_simulation(simulation_code const& code, span<number const> break; } case instruction_type::square_root: - ASIC_DEBUG_MSG("Evaluating sqrt!"); + ASIC_DEBUG_MSG("Evaluating sqrt."); push(std::sqrt(pop())); break; case instruction_type::complex_conjugate: - ASIC_DEBUG_MSG("Evaluating conj!"); + ASIC_DEBUG_MSG("Evaluating conj."); push(std::conj(pop())); break; case instruction_type::absolute: - ASIC_DEBUG_MSG("Evaluating abs!"); + ASIC_DEBUG_MSG("Evaluating abs."); push(number{std::abs(pop())}); break; case instruction_type::constant_multiplication: - ASIC_DEBUG_MSG("Evaluating cmul!"); + ASIC_DEBUG_MSG("Evaluating cmul."); push(pop() * instruction.value); break; case instruction_type::delay: { - ASIC_DEBUG_MSG("Evaluating delay!"); + ASIC_DEBUG_MSG("Evaluating delay."); auto const value = delays[instruction.index]; delays[instruction.index] = pop(); push(value); break; } case instruction_type::custom: { - ASIC_DEBUG_MSG("Evaluating custom!"); + ASIC_DEBUG_MSG("Evaluating custom."); using namespace pybind11::literals; auto const& src = code.custom_sources[instruction.index]; auto const& op = code.custom_operations[src.custom_operation_index]; @@ -165,7 +165,7 @@ simulation_state run_simulation(simulation_code const& code, span<number const> break; } case instruction_type::forward_value: - ASIC_DEBUG_MSG("Evaluating forward_value!"); + ASIC_DEBUG_MSG("Evaluating forward_value."); // Doing push(pop()) would be wasteful, so we just do nothing. break; } diff --git a/src/simulation_dod/run.h b/src/simulation/run.h similarity index 100% rename from src/simulation_dod/run.h rename to src/simulation/run.h diff --git a/src/simulation_dod/simulation.cpp b/src/simulation/simulation.cpp similarity index 100% rename from src/simulation_dod/simulation.cpp rename to src/simulation/simulation.cpp diff --git a/src/simulation_dod/simulation.h b/src/simulation/simulation.h similarity index 100% rename from src/simulation_dod/simulation.h rename to src/simulation/simulation.h