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