diff --git a/b_asic/operation.py b/b_asic/operation.py index 673fb4c5dcd71f68a6046fb24ecd8328e61661ba..1bdec6e9b11fedb3f56dbee59f8559a177414ac5 100644 --- a/b_asic/operation.py +++ b/b_asic/operation.py @@ -59,7 +59,7 @@ class Operation(GraphComponent, SignalSourceProvider): ports. Operations can be evaluated independently using evaluate_output(). - Operations may specify how to truncate inputs through truncate_input(). + Operations may specify how to quantize inputs through quantize_input(). """ @abstractmethod @@ -233,7 +233,7 @@ class Operation(GraphComponent, SignalSourceProvider): delays: Optional[MutableDelayMap] = None, prefix: str = "", bits_override: Optional[int] = None, - truncate: bool = True, + quantize: bool = True, ) -> Num: """ Evaluate the output at the given index of this operation with the given input @@ -256,7 +256,7 @@ class Operation(GraphComponent, SignalSourceProvider): bits_override : int, optional Specifies a word length override when truncating inputs which ignores the word length specified by the input signal. - truncate : bool, default: True + quantize : bool, default: True Specifies whether input truncation should be enabled in the first place. If set to False, input values will be used directly without any bit truncation. @@ -288,7 +288,7 @@ class Operation(GraphComponent, SignalSourceProvider): delays: Optional[MutableDelayMap] = None, prefix: str = "", bits_override: Optional[int] = None, - truncate: bool = True, + quantize: bool = True, ) -> Sequence[Num]: """ Evaluate all outputs of this operation given the input values. @@ -325,7 +325,7 @@ class Operation(GraphComponent, SignalSourceProvider): raise NotImplementedError @abstractmethod - def truncate_input(self, index: int, value: Num, bits: int) -> Num: + def quantize_input(self, index: int, value: Num, bits: int) -> Num: """ Truncate the value to be used as input at the given index to a certain bit length. @@ -756,7 +756,7 @@ class AbstractOperation(Operation, AbstractGraphComponent): delays: Optional[MutableDelayMap] = None, prefix: str = "", bits_override: Optional[int] = None, - truncate: bool = True, + quantize: bool = True, ) -> Num: if index < 0 or index >= self.output_count: raise IndexError( @@ -771,8 +771,8 @@ class AbstractOperation(Operation, AbstractGraphComponent): values = self.evaluate( *( - self.truncate_inputs(input_values, bits_override) - if truncate + self.quantize_inputs(input_values, bits_override) + if quantize else input_values ) ) @@ -814,7 +814,7 @@ class AbstractOperation(Operation, AbstractGraphComponent): delays: Optional[MutableDelayMap] = None, prefix: str = "", bits_override: Optional[int] = None, - truncate: bool = True, + quantize: bool = True, ) -> Sequence[Num]: return [ self.evaluate_output( @@ -824,7 +824,7 @@ class AbstractOperation(Operation, AbstractGraphComponent): delays, prefix, bits_override, - truncate, + quantize, ) for i in range(self.output_count) ] @@ -931,14 +931,14 @@ class AbstractOperation(Operation, AbstractGraphComponent): return self.input(0) # TODO: Fix - def truncate_input(self, index: int, value: Num, bits: int) -> Num: + def quantize_input(self, index: int, value: Num, bits: int) -> Num: if isinstance(value, (float, int)): return round(value) & ((2**bits) - 1) else: raise TypeError # TODO: Seems wrong??? - Oscar - def truncate_inputs( + def quantize_inputs( self, input_values: Sequence[Num], bits_override: Optional[int] = None, @@ -955,10 +955,10 @@ class AbstractOperation(Operation, AbstractGraphComponent): if bits_override is not None: if isinstance(value, complex): raise TypeError( - "Complex value cannot be truncated to {bits} bits as" + "Complex value cannot be quantized to {bits} bits as" " requested by the signal connected to input #{i}" ) - value = self.truncate_input(i, value, bits_override) + value = self.quantize_input(i, value, bits_override) args.append(value) return args diff --git a/b_asic/signal.py b/b_asic/signal.py index 6e25543d0faf2622bc050f71d51aa09a1212e969..1a05940a9209aa0142278ddb6c011a03aadb0143 100644 --- a/b_asic/signal.py +++ b/b_asic/signal.py @@ -175,7 +175,7 @@ class Signal(AbstractGraphComponent): def bits(self) -> Optional[int]: """ Get the number of bits that this operation using this signal as an - input should truncate received values to. + input should quantize received values to. None = unlimited. """ return self.param("bits") @@ -184,7 +184,7 @@ class Signal(AbstractGraphComponent): def bits(self, bits: Optional[int]) -> None: """ Set the number of bits that operations using this signal as an input - should truncate received values to. + should quantize received values to. None = unlimited. """ if bits is not None: diff --git a/b_asic/signal_flow_graph.py b/b_asic/signal_flow_graph.py index fc12e9193eee84bf3581deaad593dbcafd3a9658..f3dd86df0032ded9c816f4fc93af4b5498b4ed5d 100644 --- a/b_asic/signal_flow_graph.py +++ b/b_asic/signal_flow_graph.py @@ -344,7 +344,7 @@ class SFG(AbstractOperation): delays: Optional[MutableDelayMap] = None, prefix: str = "", bits_override: Optional[int] = None, - truncate: bool = True, + quantize: bool = True, ) -> Number: # doc-string inherited if index < 0 or index >= self.output_count: @@ -365,8 +365,8 @@ class SFG(AbstractOperation): # Set the values of our input operations to the given input values. for op, arg in zip( self._input_operations, - self.truncate_inputs(input_values, bits_override) - if truncate + self.quantize_inputs(input_values, bits_override) + if quantize else input_values, ): op.value = arg @@ -378,7 +378,7 @@ class SFG(AbstractOperation): delays, prefix, bits_override, - truncate, + quantize, deferred_delays, ) while deferred_delays: @@ -392,7 +392,7 @@ class SFG(AbstractOperation): delays, prefix, bits_override, - truncate, + quantize, new_deferred_delays, ) deferred_delays = new_deferred_delays @@ -1225,7 +1225,7 @@ class SFG(AbstractOperation): delays: MutableDelayMap, prefix: str, bits_override: Optional[int], - truncate: bool, + quantize: bool, deferred_delays: DelayQueue, ) -> Num: key_base = ( @@ -1253,7 +1253,7 @@ class SFG(AbstractOperation): delays, prefix, bits_override, - truncate, + quantize, deferred_delays, ) else: @@ -1270,7 +1270,7 @@ class SFG(AbstractOperation): delays: MutableDelayMap, prefix: str, bits_override: Optional[int], - truncate: bool, + quantize: bool, deferred_delays: DelayQueue, ) -> Num: input_values = [ @@ -1280,7 +1280,7 @@ class SFG(AbstractOperation): delays, prefix, bits_override, - truncate, + quantize, deferred_delays, ) for input_port in src.operation.inputs @@ -1292,7 +1292,7 @@ class SFG(AbstractOperation): delays, key_base, bits_override, - truncate, + quantize, ) results[key] = value return value diff --git a/b_asic/simulation.py b/b_asic/simulation.py index 67c6bf3cb5dce6e91492ac23592028eccee2c6e1..1defde586c2cc8d32d80f3a7719b69ee822e93f6 100644 --- a/b_asic/simulation.py +++ b/b_asic/simulation.py @@ -121,18 +121,18 @@ class Simulation: self, save_results: bool = True, bits_override: Optional[int] = None, - truncate: bool = True, + quantize: bool = True, ) -> Sequence[Num]: """Run one iteration of the simulation and return the resulting output values. """ - return self.run_for(1, save_results, bits_override, truncate) + return self.run_for(1, save_results, bits_override, quantize) def run_until( self, iteration: int, save_results: bool = True, bits_override: Optional[int] = None, - truncate: bool = True, + quantize: bool = True, ) -> Sequence[Num]: """ Run the simulation until its iteration is greater than or equal to the given\ @@ -151,7 +151,7 @@ class Simulation: self._delays, "", bits_override, - truncate, + quantize, ) if save_results: for key, value in results.items(): @@ -164,21 +164,21 @@ class Simulation: iterations: int, save_results: bool = True, bits_override: Optional[int] = None, - truncate: bool = True, + quantize: bool = True, ) -> Sequence[Num]: """ Run a given number of iterations of the simulation and return the output\ values of the last iteration. """ return self.run_until( - self._iteration + iterations, save_results, bits_override, truncate + self._iteration + iterations, save_results, bits_override, quantize ) def run( self, save_results: bool = True, bits_override: Optional[int] = None, - truncate: bool = True, + quantize: bool = True, ) -> Sequence[Num]: """ Run the simulation until the end of its input arrays and return the output\ @@ -186,7 +186,7 @@ class Simulation: """ if self._input_length is None: raise IndexError("Tried to run unlimited simulation") - return self.run_until(self._input_length, save_results, bits_override, truncate) + return self.run_until(self._input_length, save_results, bits_override, quantize) @property def iteration(self) -> int: diff --git a/b_asic/special_operations.py b/b_asic/special_operations.py index 6f438299b2fe69ea5f1bfaa4cc2dfb1b320ea687..3dfd763055adb642ad6f031177390bee0738da08 100644 --- a/b_asic/special_operations.py +++ b/b_asic/special_operations.py @@ -201,7 +201,7 @@ class Delay(AbstractOperation): delays: Optional[MutableDelayMap] = None, prefix: str = "", bits_override: Optional[int] = None, - truncate: bool = True, + quantize: bool = True, ) -> Num: if index != 0: raise IndexError(f"Output index out of range (expected 0-0, got {index})") @@ -216,8 +216,8 @@ class Delay(AbstractOperation): if delays is not None: value = delays.get(key, value) delays[key] = ( - self.truncate_inputs(input_values, bits_override)[0] - if truncate + self.quantize_inputs(input_values, bits_override)[0] + if quantize else input_values[0] ) if results is not None: diff --git a/legacy/simulation_oop/custom_operation.cpp b/legacy/simulation_oop/custom_operation.cpp index 03fbb4b7c8b8790c0004b885736609d9be4d6667..4ea7df0d25e525cfeed0b11dea1980a9194543af 100644 --- a/legacy/simulation_oop/custom_operation.cpp +++ b/legacy/simulation_oop/custom_operation.cpp @@ -5,11 +5,11 @@ namespace asic { -custom_operation::custom_operation(result_key key, pybind11::object evaluate_output, pybind11::object truncate_input, +custom_operation::custom_operation(result_key key, pybind11::object evaluate_output, pybind11::object quantize_input, std::size_t output_count) : nary_operation(std::move(key)) , m_evaluate_output(std::move(evaluate_output)) - , m_truncate_input(std::move(truncate_input)) + , m_quantize_input(std::move(quantize_input)) , m_output_count(output_count) {} std::size_t custom_operation::output_count() const noexcept { @@ -19,11 +19,11 @@ std::size_t custom_operation::output_count() const noexcept { number custom_operation::evaluate_output_impl(std::size_t index, evaluation_context const& context) const { using namespace pybind11::literals; auto input_values = this->evaluate_inputs(context); - return m_evaluate_output(index, std::move(input_values), "truncate"_a = false).cast<number>(); + return m_evaluate_output(index, std::move(input_values), "quantize"_a = false).cast<number>(); } -number custom_operation::truncate_input(std::size_t index, number value, std::size_t bits) const { - return m_truncate_input(index, value, bits).cast<number>(); +number custom_operation::quantize_input(std::size_t index, number value, std::size_t bits) const { + return m_quantize_input(index, value, bits).cast<number>(); } } // namespace asic diff --git a/legacy/simulation_oop/custom_operation.hpp b/legacy/simulation_oop/custom_operation.hpp index 12a2a107b7b08c9e6752e61759cb0092937e1eba..241b3698aa5e09acaa8927cd9cfed694af590a37 100644 --- a/legacy/simulation_oop/custom_operation.hpp +++ b/legacy/simulation_oop/custom_operation.hpp @@ -18,16 +18,16 @@ namespace asic { class custom_operation final : public nary_operation { public: - custom_operation(result_key key, pybind11::object evaluate_output, pybind11::object truncate_input, std::size_t output_count); + custom_operation(result_key key, pybind11::object evaluate_output, pybind11::object quantize_input, std::size_t output_count); [[nodiscard]] std::size_t output_count() const noexcept final; private: [[nodiscard]] number evaluate_output_impl(std::size_t index, evaluation_context const& context) const final; - [[nodiscard]] number truncate_input(std::size_t index, number value, std::size_t bits) const final; + [[nodiscard]] number quantize_input(std::size_t index, number value, std::size_t bits) const final; pybind11::object m_evaluate_output; - pybind11::object m_truncate_input; + pybind11::object m_quantize_input; std::size_t m_output_count; }; diff --git a/legacy/simulation_oop/operation.cpp b/legacy/simulation_oop/operation.cpp index 57a187f8485ceb3f27ee2aceee1fede7c9b4e615..8ba049545f125f47bd6d83128540816a718c1e21 100644 --- a/legacy/simulation_oop/operation.cpp +++ b/legacy/simulation_oop/operation.cpp @@ -57,14 +57,14 @@ number abstract_operation::evaluate_output(std::size_t index, evaluation_context return value; } -number abstract_operation::truncate_input(std::size_t index, number value, std::size_t bits) const { +number abstract_operation::quantize_input(std::size_t index, number value, std::size_t bits) const { if (value.imag() != 0) { throw py::type_error{ - fmt::format("Complex value cannot be truncated to {} bits as requested by the signal connected to input #{}", bits, index)}; + fmt::format("Complex value cannot be quantized to {} bits as requested by the signal connected to input #{}", bits, index)}; } if (bits > 64) { throw py::value_error{ - fmt::format("Cannot truncate to {} (more than 64) bits as requested by the singal connected to input #{}", bits, index)}; + fmt::format("Cannot quantize to {} (more than 64) bits as requested by the singal connected to input #{}", bits, index)}; } return number{static_cast<number::value_type>(static_cast<std::int64_t>(value.real()) & ((std::int64_t{1} << bits) - 1))}; } @@ -101,7 +101,7 @@ signal_source const& unary_operation::input() const noexcept { number unary_operation::evaluate_input(evaluation_context const& context) const { auto const value = m_in.evaluate_output(context); auto const bits = context.bits_override.value_or(m_in.bits().value_or(0)); - return (context.truncate && bits != 0) ? this->truncate_input(0, value, bits) : value; + return (context.quantize && bits != 0) ? this->quantize_input(0, value, bits) : value; } binary_operation::binary_operation(result_key key) @@ -123,13 +123,13 @@ signal_source const& binary_operation::rhs() const noexcept { number binary_operation::evaluate_lhs(evaluation_context const& context) const { auto const value = m_lhs.evaluate_output(context); auto const bits = context.bits_override.value_or(m_lhs.bits().value_or(0)); - return (context.truncate && bits != 0) ? this->truncate_input(0, value, bits) : value; + return (context.quantize && bits != 0) ? this->quantize_input(0, value, bits) : value; } number binary_operation::evaluate_rhs(evaluation_context const& context) const { auto const value = m_rhs.evaluate_output(context); auto const bits = context.bits_override.value_or(m_rhs.bits().value_or(0)); - return (context.truncate && bits != 0) ? this->truncate_input(0, value, bits) : value; + return (context.quantize && bits != 0) ? this->quantize_input(0, value, bits) : value; } nary_operation::nary_operation(result_key key) @@ -149,7 +149,7 @@ std::vector<number> nary_operation::evaluate_inputs(evaluation_context const& co for (auto const& input : m_inputs) { auto const value = input.evaluate_output(context); auto const bits = context.bits_override.value_or(input.bits().value_or(0)); - values.push_back((context.truncate && bits != 0) ? this->truncate_input(0, value, bits) : value); + values.push_back((context.quantize && bits != 0) ? this->quantize_input(0, value, bits) : value); } return values; } diff --git a/legacy/simulation_oop/operation.hpp b/legacy/simulation_oop/operation.hpp index 086666102a14e32895834c0616af1728e48dc400..cfffdd53ea0e4dec8fe00a96eca7fa21d659f0c2 100644 --- a/legacy/simulation_oop/operation.hpp +++ b/legacy/simulation_oop/operation.hpp @@ -30,7 +30,7 @@ struct evaluation_context final { delay_map* delays = nullptr; delay_queue* deferred_delays = nullptr; std::optional<std::size_t> bits_override{}; - bool truncate = false; + bool quantize = false; }; class signal_source final { @@ -71,7 +71,7 @@ public: protected: [[nodiscard]] virtual number evaluate_output_impl(std::size_t index, evaluation_context const& context) const = 0; - [[nodiscard]] virtual number truncate_input(std::size_t index, number value, std::size_t bits) const; + [[nodiscard]] virtual number quantize_input(std::size_t index, number value, std::size_t bits) const; [[nodiscard]] result_key const& key_base() const; [[nodiscard]] result_key key_of_output(std::size_t index) const; diff --git a/legacy/simulation_oop/signal_flow_graph.cpp b/legacy/simulation_oop/signal_flow_graph.cpp index 5248de741cff3bc7a6e03fc3e479998820c42707..6c60d7b73122903d51ff0a13a051ff717f2a120f 100644 --- a/legacy/simulation_oop/signal_flow_graph.cpp +++ b/legacy/simulation_oop/signal_flow_graph.cpp @@ -68,7 +68,7 @@ std::shared_ptr<custom_operation> signal_flow_graph_operation::add_custom_operat auto const input_count = op.attr("input_count").cast<std::size_t>(); auto const output_count = op.attr("output_count").cast<std::size_t>(); auto new_op = add_operation<custom_operation>( - op, added, std::move(key), op.attr("evaluate_output"), op.attr("truncate_input"), output_count); + op, added, std::move(key), op.attr("evaluate_output"), op.attr("quantize_input"), output_count); auto inputs = std::vector<signal_source>{}; inputs.reserve(input_count); for (auto const i : range(input_count)) { diff --git a/legacy/simulation_oop/simulation.cpp b/legacy/simulation_oop/simulation.cpp index 7d044c6a8a76b5d845f47342b2a82ec9a241a5b4..62aa55e5025d24066bb562798b025daec7126998 100644 --- a/legacy/simulation_oop/simulation.cpp +++ b/legacy/simulation_oop/simulation.cpp @@ -50,12 +50,12 @@ void simulation::set_inputs( } } -std::vector<number> simulation::step(bool save_results, std::optional<std::size_t> bits_override, bool truncate) { - return this->run_for(1, save_results, bits_override, truncate); +std::vector<number> simulation::step(bool save_results, std::optional<std::size_t> bits_override, bool quantize) { + return this->run_for(1, save_results, bits_override, quantize); } std::vector<number> simulation::run_until(iteration_type iteration, bool save_results, std::optional<std::size_t> bits_override, - bool truncate) { + bool quantize) { auto result = std::vector<number>{}; while (m_iteration < iteration) { ASIC_DEBUG_MSG("Running simulation iteration."); @@ -73,7 +73,7 @@ std::vector<number> simulation::run_until(iteration_type iteration, bool save_re context.delays = &m_delays; context.deferred_delays = &deferred_delays; context.bits_override = bits_override; - context.truncate = truncate; + context.quantize = quantize; for (auto const i : range(m_sfg.output_count())) { result.push_back(m_sfg.evaluate_output(i, context)); @@ -100,16 +100,16 @@ std::vector<number> simulation::run_until(iteration_type iteration, bool save_re } std::vector<number> simulation::run_for(iteration_type iterations, bool save_results, std::optional<std::size_t> bits_override, - bool truncate) { + bool quantize) { if (iterations > std::numeric_limits<iteration_type>::max() - m_iteration) { throw py::value_error("Simulation iteration type overflow!"); } - return this->run_until(m_iteration + iterations, save_results, bits_override, truncate); + return this->run_until(m_iteration + iterations, save_results, bits_override, quantize); } -std::vector<number> simulation::run(bool save_results, std::optional<std::size_t> bits_override, bool truncate) { +std::vector<number> simulation::run(bool save_results, std::optional<std::size_t> bits_override, bool quantize) { if (m_input_length) { - return this->run_until(*m_input_length, save_results, bits_override, truncate); + return this->run_until(*m_input_length, save_results, bits_override, quantize); } throw py::index_error{"Tried to run unlimited simulation"}; } diff --git a/legacy/simulation_oop/simulation.hpp b/legacy/simulation_oop/simulation.hpp index e10feb990c90ae314576a227d284c5ca2fc4f8ce..f359f4a5fbc7b9db5f306854fc5c4a2df8fc069c 100644 --- a/legacy/simulation_oop/simulation.hpp +++ b/legacy/simulation_oop/simulation.hpp @@ -40,12 +40,12 @@ public: void set_input(std::size_t index, input_provider_type input_provider); void set_inputs(std::vector<std::optional<input_provider_type>> input_providers); - [[nodiscard]] std::vector<number> step(bool save_results, std::optional<std::size_t> bits_override, bool truncate); + [[nodiscard]] std::vector<number> step(bool save_results, std::optional<std::size_t> bits_override, bool quantize); [[nodiscard]] std::vector<number> run_until(iteration_type iteration, bool save_results, std::optional<std::size_t> bits_override, - bool truncate); + bool quantize); [[nodiscard]] std::vector<number> run_for(iteration_type iterations, bool save_results, std::optional<std::size_t> bits_override, - bool truncate); - [[nodiscard]] std::vector<number> run(bool save_results, std::optional<std::size_t> bits_override, bool truncate); + bool quantize); + [[nodiscard]] std::vector<number> run(bool save_results, std::optional<std::size_t> bits_override, bool quantize); [[nodiscard]] iteration_type iteration() const noexcept; [[nodiscard]] pybind11::dict results() const noexcept; diff --git a/src/simulation.cpp b/src/simulation.cpp index 2f9ccd3df64dd223f695af62a60a550822525b2a..9381925b03c6140e75a48133995e9b06fbee030c 100644 --- a/src/simulation.cpp +++ b/src/simulation.cpp @@ -26,20 +26,20 @@ void define_simulation_class(pybind11::module& module) { "Set the input functions used to get values for the inputs to the internal SFG.") .def("step", &simulation::step, - py::arg("save_results") = true, py::arg("bits_override") = py::none{}, py::arg("truncate") = true, + py::arg("save_results") = true, py::arg("bits_override") = py::none{}, py::arg("quantize") = true, "Run one iteration of the simulation and return the resulting output values.") .def("run_until", &simulation::run_until, - py::arg("iteration"), py::arg("save_results") = true, py::arg("bits_override") = py::none{}, py::arg("truncate") = true, + py::arg("iteration"), py::arg("save_results") = true, py::arg("bits_override") = py::none{}, py::arg("quantize") = true, "Run the simulation until its iteration is greater than or equal to the given iteration\n" "and return the output values of the last iteration.") .def("run_for", &simulation::run_for, - py::arg("iterations"), py::arg("save_results") = true, py::arg("bits_override") = py::none{}, py::arg("truncate") = true, + py::arg("iterations"), py::arg("save_results") = true, py::arg("bits_override") = py::none{}, py::arg("quantize") = true, "Run a given number of iterations of the simulation and return the output values of the last iteration.") .def("run", &simulation::run, - py::arg("save_results") = true, py::arg("bits_override") = py::none{}, py::arg("truncate") = true, + py::arg("save_results") = true, py::arg("bits_override") = py::none{}, py::arg("quantize") = true, "Run the simulation until the end of its input arrays and return the output values of the last iteration.") .def_property_readonly("iteration", &simulation::iteration, diff --git a/src/simulation/compile.cpp b/src/simulation/compile.cpp index 4b0e7fc813efaea3fba291fad0135f753ff9403b..fd8c204e587f14f3001ede86db22b23eb9c96743 100644 --- a/src/simulation/compile.cpp +++ b/src/simulation/compile.cpp @@ -203,9 +203,9 @@ private: if (!signal.attr("bits").is_none()) { auto const bits = signal.attr("bits").cast<std::size_t>(); if (bits > 64) { - throw py::value_error{"Cannot truncate to more than 64 bits"}; + throw py::value_error{"Cannot quantize to more than 64 bits"}; } - this->add_instruction(instruction_type::truncate, no_result_index, 0).bit_mask = static_cast<std::int64_t>( + this->add_instruction(instruction_type::quantize, no_result_index, 0).bit_mask = static_cast<std::int64_t>( (std::int64_t{1} << bits) - 1); } } diff --git a/src/simulation/format_code.hpp b/src/simulation/format_code.hpp index 6b286d0e954289065882c8f795d9bdeb4dea3ed2..b338c325d807068a370b59e807288a762f80aa6b 100644 --- a/src/simulation/format_code.hpp +++ b/src/simulation/format_code.hpp @@ -53,7 +53,7 @@ namespace asic { case instruction_type::push_result: return fmt::format("push_result results[{}]", instruction.index); case instruction_type::push_delay: return fmt::format("push_delay delays[{}]", instruction.index); case instruction_type::push_constant: return fmt::format("push_constant {}", format_number(instruction.value)); - case instruction_type::truncate: return fmt::format("truncate {:#018x}", instruction.bit_mask); + case instruction_type::quantize: return fmt::format("quantize {:#018x}", instruction.bit_mask); case instruction_type::addition: return "addition"; case instruction_type::subtraction: return "subtraction"; case instruction_type::multiplication: return "multiplication"; diff --git a/src/simulation/instruction.hpp b/src/simulation/instruction.hpp index 22d0464d1e7cc19bf47cdd2a01fdd807ce53de6e..9b03d9e0bf8419166483f60e4d3b9a97efb7e875 100644 --- a/src/simulation/instruction.hpp +++ b/src/simulation/instruction.hpp @@ -14,7 +14,7 @@ enum class instruction_type : std::uint8_t { push_result, // push(results[index]) push_delay, // push(delays[index]) push_constant, // push(value) - truncate, // push(trunc(pop(), bit_mask)) + quantize, // push(trunc(pop(), bit_mask)) addition, // rhs=pop(), lhs=pop(), push(lhs + rhs) subtraction, // rhs=pop(), lhs=pop(), push(lhs - rhs) multiplication, // rhs=pop(), lhs=pop(), push(lhs * rhs) @@ -39,7 +39,7 @@ struct instruction final { union { // Index used by push_input, push_result, delay and custom. std::size_t index; - // Bit mask used by truncate. + // Bit mask used by quantize. std::int64_t bit_mask; // Constant value used by push_constant and constant_multiplication. number value; diff --git a/src/simulation/run.cpp b/src/simulation/run.cpp index da307533b3791e0d2e89cae99a61d107ea5a2301..1998b82ecbcc017961f13f0c1b98fd039b2e7467 100644 --- a/src/simulation/run.cpp +++ b/src/simulation/run.cpp @@ -18,27 +18,27 @@ namespace py = pybind11; namespace asic { -[[nodiscard]] static number truncate_value(number value, std::int64_t bit_mask) { +[[nodiscard]] static number quantize_value(number value, std::int64_t bit_mask) { if (value.imag() != 0) { - throw py::type_error{"Complex value cannot be truncated"}; + throw py::type_error{"Complex value cannot be quantized"}; } return number{static_cast<number::value_type>(static_cast<std::int64_t>(value.real()) & bit_mask)}; } -[[nodiscard]] static std::int64_t setup_truncation_parameters(bool& truncate, std::optional<std::uint8_t>& bits_override) { - if (truncate && bits_override) { - truncate = false; // Ignore truncate instructions, they will be truncated using bits_override instead. +[[nodiscard]] static std::int64_t setup_truncation_parameters(bool& quantize, std::optional<std::uint8_t>& bits_override) { + if (quantize && bits_override) { + quantize = false; // Ignore quantize instructions, they will be quantized using bits_override instead. if (*bits_override > 64) { - throw py::value_error{"Cannot truncate to more than 64 bits"}; + throw py::value_error{"Cannot quantize to more than 64 bits"}; } return static_cast<std::int64_t>((std::int64_t{1} << *bits_override) - 1); // Return the bit mask override to use. } - bits_override.reset(); // Don't use bits_override if truncate is false. + bits_override.reset(); // Don't use bits_override if quantize is false. return std::int64_t{}; } simulation_state run_simulation(simulation_code const& code, span<number const> inputs, span<number> delays, - std::optional<std::uint8_t> bits_override, bool truncate) { + std::optional<std::uint8_t> bits_override, bool quantize) { ASIC_ASSERT(inputs.size() == code.input_count); ASIC_ASSERT(delays.size() == code.delays.size()); ASIC_ASSERT(code.output_count <= code.required_stack_size); @@ -72,8 +72,8 @@ simulation_state run_simulation(simulation_code const& code, span<number const> return *(stack_pointer - 1); }; - // Check if results should be truncated. - auto const bit_mask_override = setup_truncation_parameters(truncate, bits_override); + // Check if results should be quantized. + auto const bit_mask_override = setup_truncation_parameters(quantize, bits_override); // Hot instruction evaluation loop. for (auto const& instruction : code.instructions) { @@ -92,9 +92,9 @@ simulation_state run_simulation(simulation_code const& code, span<number const> case instruction_type::push_constant: push(instruction.value); break; - case instruction_type::truncate: - if (truncate) { - push(truncate_value(pop(), instruction.bit_mask)); + case instruction_type::quantize: + if (quantize) { + push(quantize_value(pop(), instruction.bit_mask)); } break; case instruction_type::addition: { @@ -163,16 +163,16 @@ simulation_state run_simulation(simulation_code const& code, span<number const> for (auto i = std::size_t{0}; i < op.input_count; ++i) { input_values.push_back(pop()); } - push(op.evaluate_output(src.output_index, std::move(input_values), "truncate"_a = truncate).cast<number>()); + push(op.evaluate_output(src.output_index, std::move(input_values), "quantize"_a = quantize).cast<number>()); break; } case instruction_type::forward_value: // Do nothing, since doing push(pop()) would be pointless. break; } - // If we've been given a global override for how many bits to use, always truncate the result. + // If we've been given a global override for how many bits to use, always quantize the result. if (bits_override) { - push(truncate_value(pop(), bit_mask_override)); + push(quantize_value(pop(), bit_mask_override)); } // Store the result. state.results[instruction.result_index] = peek(); diff --git a/src/simulation/run.hpp b/src/simulation/run.hpp index 32c56b3e764c01080bbf28b93ebb4e1fec4d9556..7cc05e5fa68709cfaac662948e751afadd7d37e3 100644 --- a/src/simulation/run.hpp +++ b/src/simulation/run.hpp @@ -16,7 +16,7 @@ struct simulation_state final { }; simulation_state run_simulation(simulation_code const& code, span<number const> inputs, span<number> delays, - std::optional<std::uint8_t> bits_override, bool truncate); + std::optional<std::uint8_t> bits_override, bool quantize); } // namespace asic diff --git a/src/simulation/simulation.cpp b/src/simulation/simulation.cpp index 540505b40d2b09fa301c030ca374102b0d63ba02..34ac320fbde53729a45769efcac806a4f449aac4 100644 --- a/src/simulation/simulation.cpp +++ b/src/simulation/simulation.cpp @@ -62,12 +62,12 @@ void simulation::set_inputs( } } -std::vector<number> simulation::step(bool save_results, std::optional<std::uint8_t> bits_override, bool truncate) { - return this->run_for(1, save_results, bits_override, truncate); +std::vector<number> simulation::step(bool save_results, std::optional<std::uint8_t> bits_override, bool quantize) { + return this->run_for(1, save_results, bits_override, quantize); } std::vector<number> simulation::run_until(iteration_type iteration, bool save_results, std::optional<std::uint8_t> bits_override, - bool truncate) { + bool quantize) { auto result = std::vector<number>{}; while (m_iteration < iteration) { ASIC_DEBUG_MSG("Running simulation iteration."); @@ -75,7 +75,7 @@ std::vector<number> simulation::run_until(iteration_type iteration, bool save_re for (auto&& [input, function] : zip(inputs, m_input_functions)) { input = function(m_iteration); } - auto state = run_simulation(m_code, inputs, m_delays, bits_override, truncate); + auto state = run_simulation(m_code, inputs, m_delays, bits_override, quantize); result = std::move(state.stack); if (save_results) { m_results.push_back(std::move(state.results)); @@ -86,16 +86,16 @@ std::vector<number> simulation::run_until(iteration_type iteration, bool save_re } std::vector<number> simulation::run_for(iteration_type iterations, bool save_results, std::optional<std::uint8_t> bits_override, - bool truncate) { + bool quantize) { if (iterations > std::numeric_limits<iteration_type>::max() - m_iteration) { throw py::value_error("Simulation iteration type overflow!"); } - return this->run_until(m_iteration + iterations, save_results, bits_override, truncate); + return this->run_until(m_iteration + iterations, save_results, bits_override, quantize); } -std::vector<number> simulation::run(bool save_results, std::optional<std::uint8_t> bits_override, bool truncate) { +std::vector<number> simulation::run(bool save_results, std::optional<std::uint8_t> bits_override, bool quantize) { if (m_input_length) { - return this->run_until(*m_input_length, save_results, bits_override, truncate); + return this->run_until(*m_input_length, save_results, bits_override, quantize); } throw py::index_error{"Tried to run unlimited simulation"}; } diff --git a/src/simulation/simulation.hpp b/src/simulation/simulation.hpp index e5624cd27a801383a07cd64b54ec5c04028ea5eb..ec930e83a13400ebaf0566154d06a06c8f0d0901 100644 --- a/src/simulation/simulation.hpp +++ b/src/simulation/simulation.hpp @@ -28,12 +28,12 @@ public: void set_input(std::size_t index, input_provider_type input_provider); void set_inputs(std::vector<std::optional<input_provider_type>> input_providers); - [[nodiscard]] std::vector<number> step(bool save_results, std::optional<std::uint8_t> bits_override, bool truncate); + [[nodiscard]] std::vector<number> step(bool save_results, std::optional<std::uint8_t> bits_override, bool quantize); [[nodiscard]] std::vector<number> run_until(iteration_type iteration, bool save_results, std::optional<std::uint8_t> bits_override, - bool truncate); + bool quantize); [[nodiscard]] std::vector<number> run_for(iteration_type iterations, bool save_results, std::optional<std::uint8_t> bits_override, - bool truncate); - [[nodiscard]] std::vector<number> run(bool save_results, std::optional<std::uint8_t> bits_override, bool truncate); + bool quantize); + [[nodiscard]] std::vector<number> run(bool save_results, std::optional<std::uint8_t> bits_override, bool quantize); [[nodiscard]] iteration_type iteration() const noexcept; [[nodiscard]] pybind11::dict results() const noexcept;