diff --git a/include/halco/hicann-dls/vx/cadc.h b/include/halco/hicann-dls/vx/cadc.h index 727d5b738f918fd213856445b57c2d09c5a6e7f6..6e11c238ade0cd458ca109250da6c8163f9fcb54 100644 --- a/include/halco/hicann-dls/vx/cadc.h +++ b/include/halco/hicann-dls/vx/cadc.h @@ -114,6 +114,121 @@ struct GENPYBIND(inline_base("*")) CADCSamplesOnDLS constexpr explicit CADCSamplesOnDLS(uintmax_t const val = 0) : rant_t(val) {} }; + +struct SynapseQuadOnDLS; +struct SynapseWeightQuadOnDLS; +struct SynapseLabelQuadOnDLS; +struct SynapseCorrelationCalibQuadOnDLS; + + +HALCO_COORDINATE_MIXIN(CADCChannelTypeMixin, CADCChannelType, cadc_channel_type) + +struct GENPYBIND(inline_base("*CADCChannelTypeMixin*")) CADCSampleQuadUnspecifiedReadoutOnSynram + : public CADCChannelTypeMixin<CADCSampleQuadUnspecifiedReadoutOnSynram, SynapseQuadOnSynram> +{ + CADCSampleQuadUnspecifiedReadoutOnSynram() = default; + + explicit CADCSampleQuadUnspecifiedReadoutOnSynram( + SynapseQuadOnSynram const& quad, CADCChannelType const& cadc_channel_type) : + mixin_t(quad, cadc_channel_type) + {} + + explicit CADCSampleQuadUnspecifiedReadoutOnSynram(enum_type const& e) : mixin_t(e) {} + + SynapseQuadOnSynram toSynapseQuadOnSynram() const + { + return This(); + } +}; + + +HALCO_COORDINATE_MIXIN(CADCReadoutTypeMixin, CADCReadoutType, cadc_readout_type) + +struct GENPYBIND(inline_base("*CADCReadoutTypeMixin*")) CADCSampleQuadOnSynram + : public CADCReadoutTypeMixin<CADCSampleQuadOnSynram, CADCSampleQuadUnspecifiedReadoutOnSynram> +{ + CADCSampleQuadOnSynram() = default; + + explicit CADCSampleQuadOnSynram( + SynapseQuadOnSynram const& quad, + CADCChannelType const& cadc_channel_type, + CADCReadoutType const& cadc_readout_type = CADCReadoutType()) : + mixin_t( + CADCSampleQuadUnspecifiedReadoutOnSynram(quad, cadc_channel_type), cadc_readout_type) + {} + + explicit CADCSampleQuadOnSynram(enum_type const& e) : mixin_t(e) {} + + CADCSampleQuadUnspecifiedReadoutOnSynram toCADCSampleQuadUnspecifiedReadoutOnSynram() const + { + return This(); + } +}; + +struct GENPYBIND(inline_base("*SynramMixin*")) CADCSampleQuadOnDLS + : public SynramMixin<CADCSampleQuadOnDLS, CADCSampleQuadOnSynram> +{ + CADCSampleQuadOnDLS() = default; + + explicit CADCSampleQuadOnDLS(CADCSampleQuadOnSynram const& block, SynramOnDLS const& synram) : + mixin_t(block, synram) + {} + + explicit CADCSampleQuadOnDLS(enum_type const& e) : mixin_t(e) {} + + CADCSampleQuadOnSynram toCADCSampleQuadOnSynram() const + { + return This(); + } + + SynapseQuadOnDLS toSynapseQuadOnDLS() const; + SynapseWeightQuadOnDLS toSynapseWeightQuadOnDLS() const; + SynapseLabelQuadOnDLS toSynapseLabelQuadOnDLS() const; + SynapseCorrelationCalibQuadOnDLS toSynapseCorrelationCalibQuadOnDLS() const; +}; + +struct GENPYBIND(inline_base("*CADCChannelTypeMixin*")) CADCChannelConfigOnSynram + : public CADCChannelTypeMixin<CADCChannelConfigOnSynram, CADCChannelColumnOnSynram> +{ + CADCChannelConfigOnSynram() = default; + + explicit CADCChannelConfigOnSynram( + CADCChannelColumnOnSynram const& quad, CADCChannelType const& cadc_channel_type) : + mixin_t(quad, cadc_channel_type) + {} + + explicit CADCChannelConfigOnSynram(enum_type const& e) : mixin_t(e) {} + + CADCChannelColumnOnSynram toCADCChannelColumnOnSynram() const + { + return This(); + } + SynapseOnSynapseRow toSynapseOnSynapseRow() const + { + return SynapseOnSynapseRow(int(toCADCChannelColumnOnSynram().toEnum())); + } +}; + + +struct GENPYBIND(inline_base("*SynramMixin*")) CADCChannelConfigOnDLS + : public SynramMixin<CADCChannelConfigOnDLS, CADCChannelConfigOnSynram> +{ + CADCChannelConfigOnDLS() = default; + + explicit CADCChannelConfigOnDLS( + CADCChannelConfigOnSynram const& block, SynramOnDLS const& synram = SynramOnDLS()) : + mixin_t(block, synram) + {} + + explicit CADCChannelConfigOnDLS(enum_type const& e) : mixin_t(e) {} + + CADCChannelConfigOnSynram toCADCChannelConfigOnSynram() const + { + return This(); + } + NeuronConfigBlockOnDLS toNeuronConfigBlockOnDLS() const; +}; + } // namespace halco::hicann_dls::vx namespace std { @@ -125,5 +240,10 @@ HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::CADCChannelColumnOnSynram) HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::CADCSampleRowOnDLS) HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::CADCOffsetSRAMTimingConfigOnDLS) HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::CADCSamplesOnDLS) +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::CADCSampleQuadOnDLS) +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::CADCChannelConfigOnSynram) +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::CADCChannelConfigOnDLS) +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::CADCSampleQuadUnspecifiedReadoutOnSynram) +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::CADCSampleQuadOnSynram) } // namespace std diff --git a/include/halco/hicann-dls/vx/cadc_ns_includes.h b/include/halco/hicann-dls/vx/cadc_ns_includes.h deleted file mode 100644 index 476016dcc03f8ac0f8ba8f14c70a3ddde1e91261..0000000000000000000000000000000000000000 --- a/include/halco/hicann-dls/vx/cadc_ns_includes.h +++ /dev/null @@ -1,123 +0,0 @@ -struct SynapseQuadOnDLS; -struct SynapseWeightQuadOnDLS; -struct SynapseLabelQuadOnDLS; -struct SynapseCorrelationCalibQuadOnDLS; - -using CADCOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCOnDLS; -using CADCConfigOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCConfigOnDLS; -using CADCChannelType GENPYBIND(visible) = halco::hicann_dls::vx::CADCChannelType; -using CADCReadoutType GENPYBIND(visible) = halco::hicann_dls::vx::CADCReadoutType; -using CADCChannelColumnOnSynram GENPYBIND(visible) = - halco::hicann_dls::vx::CADCChannelColumnOnSynram; -using CADCSampleRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCSampleRowOnDLS; -using CADCOffsetSRAMTimingConfigOnDLS GENPYBIND(visible) = - halco::hicann_dls::vx::CADCOffsetSRAMTimingConfigOnDLS; -using CADCSamplesOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCSamplesOnDLS; - -HALCO_COORDINATE_MIXIN(CADCChannelTypeMixin, CADCChannelType, cadc_channel_type) - -struct GENPYBIND(inline_base("*CADCChannelTypeMixin*")) CADCSampleQuadUnspecifiedReadoutOnSynram - : public CADCChannelTypeMixin<CADCSampleQuadUnspecifiedReadoutOnSynram, SynapseQuadOnSynram> -{ - CADCSampleQuadUnspecifiedReadoutOnSynram() = default; - - explicit CADCSampleQuadUnspecifiedReadoutOnSynram( - SynapseQuadOnSynram const& quad, CADCChannelType const& cadc_channel_type) : - mixin_t(quad, cadc_channel_type) - {} - - explicit CADCSampleQuadUnspecifiedReadoutOnSynram(enum_type const& e) : mixin_t(e) {} - - SynapseQuadOnSynram toSynapseQuadOnSynram() const - { - return This(); - } -}; - - -HALCO_COORDINATE_MIXIN(CADCReadoutTypeMixin, CADCReadoutType, cadc_readout_type) - -struct GENPYBIND(inline_base("*CADCReadoutTypeMixin*")) CADCSampleQuadOnSynram - : public CADCReadoutTypeMixin<CADCSampleQuadOnSynram, CADCSampleQuadUnspecifiedReadoutOnSynram> -{ - CADCSampleQuadOnSynram() = default; - - explicit CADCSampleQuadOnSynram( - SynapseQuadOnSynram const& quad, - CADCChannelType const& cadc_channel_type, - CADCReadoutType const& cadc_readout_type = CADCReadoutType()) : - mixin_t( - CADCSampleQuadUnspecifiedReadoutOnSynram(quad, cadc_channel_type), cadc_readout_type) - {} - - explicit CADCSampleQuadOnSynram(enum_type const& e) : mixin_t(e) {} - - CADCSampleQuadUnspecifiedReadoutOnSynram toCADCSampleQuadUnspecifiedReadoutOnSynram() const - { - return This(); - } -}; - -struct GENPYBIND(inline_base("*SynramMixin*")) CADCSampleQuadOnDLS - : public SynramMixin<CADCSampleQuadOnDLS, CADCSampleQuadOnSynram> -{ - CADCSampleQuadOnDLS() = default; - - explicit CADCSampleQuadOnDLS(CADCSampleQuadOnSynram const& block, SynramOnDLS const& synram) : - mixin_t(block, synram) - {} - - explicit CADCSampleQuadOnDLS(enum_type const& e) : mixin_t(e) {} - - CADCSampleQuadOnSynram toCADCSampleQuadOnSynram() const - { - return This(); - } - - SynapseQuadOnDLS toSynapseQuadOnDLS() const; - SynapseWeightQuadOnDLS toSynapseWeightQuadOnDLS() const; - SynapseLabelQuadOnDLS toSynapseLabelQuadOnDLS() const; - SynapseCorrelationCalibQuadOnDLS toSynapseCorrelationCalibQuadOnDLS() const; -}; - -struct GENPYBIND(inline_base("*CADCChannelTypeMixin*")) CADCChannelConfigOnSynram - : public CADCChannelTypeMixin<CADCChannelConfigOnSynram, CADCChannelColumnOnSynram> -{ - CADCChannelConfigOnSynram() = default; - - explicit CADCChannelConfigOnSynram( - CADCChannelColumnOnSynram const& quad, CADCChannelType const& cadc_channel_type) : - mixin_t(quad, cadc_channel_type) - {} - - explicit CADCChannelConfigOnSynram(enum_type const& e) : mixin_t(e) {} - - CADCChannelColumnOnSynram toCADCChannelColumnOnSynram() const - { - return This(); - } - SynapseOnSynapseRow toSynapseOnSynapseRow() const - { - return SynapseOnSynapseRow(int(toCADCChannelColumnOnSynram().toEnum())); - } -}; - - -struct GENPYBIND(inline_base("*SynramMixin*")) CADCChannelConfigOnDLS - : public SynramMixin<CADCChannelConfigOnDLS, CADCChannelConfigOnSynram> -{ - CADCChannelConfigOnDLS() = default; - - explicit CADCChannelConfigOnDLS( - CADCChannelConfigOnSynram const& block, SynramOnDLS const& synram = SynramOnDLS()) : - mixin_t(block, synram) - {} - - explicit CADCChannelConfigOnDLS(enum_type const& e) : mixin_t(e) {} - - CADCChannelConfigOnSynram toCADCChannelConfigOnSynram() const - { - return This(); - } - NeuronConfigBlockOnDLS toNeuronConfigBlockOnDLS() const; -}; diff --git a/include/halco/hicann-dls/vx/cadc_ns_includes_impl.h b/include/halco/hicann-dls/vx/cadc_ns_includes_impl.h deleted file mode 100644 index c23af82be37814901b2118d6bbfce02c86af0e6e..0000000000000000000000000000000000000000 --- a/include/halco/hicann-dls/vx/cadc_ns_includes_impl.h +++ /dev/null @@ -1,31 +0,0 @@ -SynapseQuadOnDLS CADCSampleQuadOnDLS::toSynapseQuadOnDLS() const -{ - return SynapseQuadOnDLS( - toCADCSampleQuadOnSynram() - .toCADCSampleQuadUnspecifiedReadoutOnSynram() - .toSynapseQuadOnSynram(), - toSynramOnDLS()); -} - -SynapseWeightQuadOnDLS CADCSampleQuadOnDLS::toSynapseWeightQuadOnDLS() const -{ - return toSynapseQuadOnDLS().toSynapseWeightQuadOnDLS(); -} - -SynapseLabelQuadOnDLS CADCSampleQuadOnDLS::toSynapseLabelQuadOnDLS() const -{ - return toSynapseQuadOnDLS().toSynapseLabelQuadOnDLS(); -} - -SynapseCorrelationCalibQuadOnDLS CADCSampleQuadOnDLS::toSynapseCorrelationCalibQuadOnDLS() const -{ - return toSynapseQuadOnDLS().toSynapseCorrelationCalibQuadOnDLS(); -} - - -NeuronConfigBlockOnDLS CADCChannelConfigOnDLS::toNeuronConfigBlockOnDLS() const -{ - return NeuronConfigBlockOnDLS( - (2 * toSynramOnDLS().toEnum()) + - (toSynapseOnSynapseRow() / NeuronConfigOnNeuronConfigBlock::size)); -} diff --git a/include/halco/hicann-dls/vx/neuron.h b/include/halco/hicann-dls/vx/neuron.h index 5017042c914792cbaf1bfe379eee31b79fc1dca1..dc0157a2b59e54903ef3eeaa9bbfa324881dbbe2 100644 --- a/include/halco/hicann-dls/vx/neuron.h +++ b/include/halco/hicann-dls/vx/neuron.h @@ -6,7 +6,13 @@ #include "halco/common/mixin.h" #include "halco/common/typed_array.h" +#include "halco/hicann-dls/vx/quad.h" #include "halco/hicann-dls/vx/synapse.h" +#include "halco/hicann-dls/vx/synram.h" + +namespace cereal { +class access; +} // namespace cereal namespace halco::hicann_dls::vx GENPYBIND_TAG_HALCO_HICANN_DLS_VX { @@ -19,6 +25,7 @@ struct SpikeCounterReadBlockOnDLS; struct SpikeCounterReadOnDLS; struct SpikeCounterResetBlockOnDLS; struct SpikeCounterResetOnDLS; +struct SynapseOnSynapseRow; struct NeuronEventOutputOnNeuronBackendBlock; struct NeuronEventOutputOnDLS; struct CrossbarInputOnDLS; @@ -26,6 +33,8 @@ struct NeuronBackendConfigBlockOnDLS; struct BlockPostPulseOnDLS; struct ColumnCorrelationQuadOnDLS; struct ColumnCurrentQuadOnDLS; +struct NeuronConfigOnDLS; +struct NeuronBackendConfigOnDLS; /**********\ Neuron @@ -323,6 +332,323 @@ struct GENPYBIND(inline_base("*")) NeuronBlockOnDLS {} }; + +/** + * Horizontal neuron location on the two dimensional neuron grid. + */ +struct GENPYBIND(inline_base("*")) NeuronColumnOnDLS + : public common::detail::RantWrapper<NeuronColumnOnDLS, uint_fast16_t, 255, 0> + , public common::detail::XRangedTrait +{ + constexpr explicit NeuronColumnOnDLS(uintmax_t const val = 0) GENPYBIND(implicit_conversion) : + rant_t(val) + {} + + SynapseOnSynapseRow toSynapseOnSynapseRow() const; + CapMemColumnOnCapMemBlock toCapMemColumnOnCapMemBlock() const; + NeuronEventOutputOnDLS toNeuronEventOutputOnDLS() const; +}; + +/** + * DLS-global neuron location on the two dimensional neuron grid. + */ +struct GENPYBIND(inline_base("*")) AtomicNeuronOnDLS + : public common::detail::GridCoordinate<AtomicNeuronOnDLS, NeuronColumnOnDLS, NeuronRowOnDLS> +{ + GRID_COMMON_CONSTRUCTORS(AtomicNeuronOnDLS) + + NeuronColumnOnDLS toNeuronColumnOnDLS() const + { + return x(); + } + NeuronRowOnDLS toNeuronRowOnDLS() const + { + return y(); + } + + NeuronResetOnDLS toNeuronResetOnDLS() const; + SpikeCounterReadOnDLS toSpikeCounterReadOnDLS() const; + SpikeCounterResetOnDLS toSpikeCounterResetOnDLS() const; + NeuronConfigOnDLS toNeuronConfigOnDLS() const; + NeuronBackendConfigOnDLS toNeuronBackendConfigOnDLS() const; + + CapMemBlockOnDLS toCapMemBlockOnDLS() const; + CapMemColumnOnCapMemBlock toCapMemColumnOnCapMemBlock() const; + SynramOnDLS toSynramOnDLS() const; + SynapseQuadColumnOnDLS toSynapseQuadColumnOnDLS() const; + ColumnCorrelationQuadOnDLS toColumnCorrelationQuadOnDLS() const; + ColumnCurrentQuadOnDLS toColumnCurrentQuadOnDLS() const; +}; + + +/** + * Horizontal neuron location on a logical neuron. + */ +struct GENPYBIND(inline_base("*")) NeuronColumnOnLogicalNeuron + : public common::detail::RantWrapper< + NeuronColumnOnLogicalNeuron, + uint_fast16_t, + (NeuronColumnOnDLS::size / NeuronBackendConfigBlockOnDLS::size) - 1, + 0> + , public common::detail::XRangedTrait +{ + constexpr explicit NeuronColumnOnLogicalNeuron(uintmax_t const val = 0) + GENPYBIND(implicit_conversion) : + rant_t(val) + {} +}; + + +/** + * Local neuron location on a logical neuron. + */ +struct GENPYBIND(inline_base("*")) AtomicNeuronOnLogicalNeuron + : public common::detail::GridCoordinate< + AtomicNeuronOnLogicalNeuron, + NeuronColumnOnLogicalNeuron, + NeuronRowOnLogicalNeuron> +{ + GRID_COMMON_CONSTRUCTORS(AtomicNeuronOnLogicalNeuron) + + NeuronColumnOnLogicalNeuron toNeuronColumnOnLogicalNeuron() const + { + return x(); + } + NeuronRowOnLogicalNeuron toNeuronRowOnLogicalNeuron() const + { + return y(); + } + + enum class Direction + { + left, + right, + opposite_row + }; + + /** + * Get neighbor if it exists on the chip. + * @throws OverflowError if neighbor does not exist + * @return AtomicNeuronOnLogicalNeuron + */ + AtomicNeuronOnLogicalNeuron get_neighbor(Direction const& direction) const; +}; + + +/** + * Compartment index. + * Its range is chosen such that the maximally possible number of compartments in a neuron backend + * block can be created. This is size-2, because one compartment has to connect top and bottom row + * and therefore consists of two atomic neuron circuits. + */ +struct GENPYBIND(inline_base("*")) CompartmentOnLogicalNeuron + : public common::detail::RantWrapper< + CompartmentOnLogicalNeuron, + uint_fast16_t, + (AtomicNeuronOnDLS::size / NeuronBackendConfigBlockOnDLS::size) - 2, + 0> +{ + constexpr explicit CompartmentOnLogicalNeuron(uintmax_t const val = 0) + GENPYBIND(implicit_conversion) : + rant_t(val) + {} +}; + + +/** + * Logical neuron compartments. + */ +struct GENPYBIND(visible) LogicalNeuronCompartments +{ + typedef std::vector<AtomicNeuronOnLogicalNeuron> Compartment; + typedef std::map<CompartmentOnLogicalNeuron, Compartment> Compartments; + + LogicalNeuronCompartments() = default; + /** + * Construct logical neuron compartments from compartments. + * The compartment members are to be unique. + * @param compartments Compartments to construct neuron from + */ + explicit LogicalNeuronCompartments(Compartments const& compartments); + + Compartments const& get_compartments() const; + + /** + * Flip locations in the x dimension. + * 1 2 3 4 becomes 4 3 2 1 + * 5 6 6 5 + * @return Flipped compartments + */ + LogicalNeuronCompartments flip_x() const; + + /** + * Flip locations in the y dimension. + * 1 2 3 4 becomes 5 6 + * 5 6 1 2 3 4 + * @return Flipped compartments + */ + LogicalNeuronCompartments flip_y() const; + + NeuronColumnOnLogicalNeuron get_left_most_column() const; + NeuronColumnOnLogicalNeuron get_right_most_column() const; + + NeuronRowOnLogicalNeuron get_top_most_row() const; + NeuronRowOnLogicalNeuron get_bottom_most_row() const; + + bool operator==(LogicalNeuronCompartments const& other) const; + bool operator!=(LogicalNeuronCompartments const& other) const; + + bool operator<(LogicalNeuronCompartments const& other) const; + bool operator>(LogicalNeuronCompartments const& other) const; + bool operator<=(LogicalNeuronCompartments const& other) const; + bool operator>=(LogicalNeuronCompartments const& other) const; + + GENPYBIND(stringstream) + friend std::ostream& operator<<(std::ostream& os, LogicalNeuronCompartments const& config); + +private: + friend class cereal::access; + template <typename Archive> + void serialize(Archive& ar, uint32_t); + + Compartments m_compartments; +}; + + +/** + * Logical neuron location on the neuron grid. + */ +struct GENPYBIND(visible) LogicalNeuronOnDLS +{ + typedef std::map<CompartmentOnLogicalNeuron, std::vector<AtomicNeuronOnDLS>> PlacedCompartments; + + LogicalNeuronOnDLS() = default; + + /** + * Construct logical neuron location from compartments and global anchor. + * The compartments' relative coordinates are anchored at the left top corner. + * @param compartments Compartments to construct neuron from + * @param anchor Anchor to construct neuron from + */ + LogicalNeuronOnDLS( + LogicalNeuronCompartments const& compartments, AtomicNeuronOnDLS const& anchor); + + /** + * Get compartments placed by anchor. + * @return Placed compartments + */ + PlacedCompartments get_placed_compartments() const; + + bool operator==(LogicalNeuronOnDLS const& other) const; + bool operator!=(LogicalNeuronOnDLS const& other) const; + + GENPYBIND(stringstream) + friend std::ostream& operator<<(std::ostream& os, LogicalNeuronOnDLS const& config); + + bool operator<(LogicalNeuronOnDLS const& other) const; + bool operator>(LogicalNeuronOnDLS const& other) const; + bool operator<=(LogicalNeuronOnDLS const& other) const; + bool operator>=(LogicalNeuronOnDLS const& other) const; + +private: + friend class cereal::access; + template <typename Archive> + void serialize(Archive& ar, uint32_t); + + PlacedCompartments m_compartments; +}; + + +HALCO_COORDINATE_MIXIN(NeuronConfigMixin, NeuronConfigBlockOnDLS, neuron) + +struct GENPYBIND(inline_base("*NeuronConfigMixin*")) NeuronConfigOnDLS + : public NeuronConfigMixin<NeuronConfigOnDLS, NeuronConfigOnNeuronConfigBlock> +{ + NeuronConfigOnDLS() = default; + + explicit NeuronConfigOnDLS( + NeuronConfigOnNeuronConfigBlock const& neuron, + NeuronConfigBlockOnDLS const& block = NeuronConfigBlockOnDLS()) : + mixin_t(neuron, block) + {} + + explicit NeuronConfigOnDLS(enum_type const& e) : mixin_t(e) {} + + NeuronConfigOnNeuronConfigBlock toNeuronConfigOnNeuronConfigBlock() const + { + return This(); + } + NeuronResetOnDLS toNeuronResetOnDLS() const; + SpikeCounterReadOnDLS toSpikeCounterReadOnDLS() const; + SpikeCounterResetOnDLS toSpikeCounterResetOnDLS() const; + AtomicNeuronOnDLS toAtomicNeuronOnDLS() const; + SynapseQuadColumnOnDLS toSynapseQuadColumnOnDLS() const; + EntryOnQuad toEntryOnQuad() const; + NeuronRowOnDLS toNeuronRowOnDLS() const; + SynapseOnSynapseRow toSynapseOnSynapseRow() const; + NeuronBackendConfigBlockOnDLS toNeuronBackendConfigBlockOnDLS() const; + NeuronBackendConfigOnNeuronBackendConfigBlock toNeuronBackendConfigOnNeuronBackendConfigBlock() + const; + CommonNeuronBackendConfigOnDLS toCommonNeuronBackendConfigOnDLS() const; + NeuronBackendConfigOnDLS toNeuronBackendConfigOnDLS() const; + SynramOnDLS toSynramOnDLS() const; + ColumnCorrelationQuadOnDLS toColumnCorrelationQuadOnDLS() const; + ColumnCurrentQuadOnDLS toColumnCurrentQuadOnDLS() const; +}; + +struct GENPYBIND(inline_base("*NeuronBackendConfigMixin*")) NeuronBackendConfigOnDLS + : public NeuronBackendConfigMixin< + NeuronBackendConfigOnDLS, + NeuronBackendConfigOnNeuronBackendConfigBlock> +{ + NeuronBackendConfigOnDLS() = default; + + explicit NeuronBackendConfigOnDLS( + NeuronBackendConfigOnNeuronBackendConfigBlock const& neuron, + NeuronBackendConfigBlockOnDLS const& block = NeuronBackendConfigBlockOnDLS()) : + mixin_t(neuron, block) + {} + + explicit NeuronBackendConfigOnDLS(enum_type const& e) : mixin_t(e) {} + + NeuronBackendConfigOnNeuronBackendConfigBlock toNeuronBackendConfigOnNeuronBackendConfigBlock() + const + { + return This(); + } + + NeuronColumnOnDLS toNeuronColumnOnDLS() const; + NeuronRowOnDLS toNeuronRowOnDLS() const; + CommonNeuronBackendConfigOnDLS toCommonNeuronBackendConfigOnDLS() const; + SpikeCounterReadOnDLS toSpikeCounterReadOnDLS() const; + SpikeCounterResetOnDLS toSpikeCounterResetOnDLS() const; + NeuronConfigOnDLS toNeuronConfigOnDLS() const; + AtomicNeuronOnDLS toAtomicNeuronOnDLS() const; + SynramOnDLS toSynramOnDLS() const; + NeuronConfigBlockOnDLS toNeuronConfigBlockOnDLS() const; +}; + +struct GENPYBIND(inline_base("*SynramMixin*")) NeuronResetQuadOnDLS + : public SynramMixin<NeuronResetQuadOnDLS, SynapseQuadColumnOnDLS> +{ + NeuronResetQuadOnDLS() = default; + + explicit NeuronResetQuadOnDLS( + SynapseQuadColumnOnDLS const& quad, SynramOnDLS const& synram = SynramOnDLS()) : + mixin_t(quad, synram) + {} + + explicit NeuronResetQuadOnDLS(enum_type const& e) : mixin_t(e) {} + + SynapseQuadColumnOnDLS toSynapseQuadColumnOnDLS() const + { + return This(); + } + typedef common::typed_array<NeuronResetOnDLS, EntryOnQuad> neuron_reset_type + GENPYBIND(opaque(false)); + neuron_reset_type toNeuronResetOnDLS() const; +}; + } // namespace halco::hicann_dls::vx namespace std { @@ -349,5 +675,13 @@ HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::NeuronSRAMTimingConfigOnDLS) HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::NeuronBackendSRAMTimingConfigOnDLS) HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::NeuronRowOnLogicalNeuron) HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::NeuronBlockOnDLS) +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::NeuronColumnOnDLS) +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::AtomicNeuronOnDLS) +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::NeuronColumnOnLogicalNeuron) +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::AtomicNeuronOnLogicalNeuron) +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::CompartmentOnLogicalNeuron) +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::NeuronConfigOnDLS) +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::NeuronBackendConfigOnDLS) +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::NeuronResetQuadOnDLS) } // namespace std diff --git a/include/halco/hicann-dls/vx/neuron_ns_includes.h b/include/halco/hicann-dls/vx/neuron_ns_includes.h deleted file mode 100644 index d3f5091bad9e36979c6685c9e8584a7c4b2e1e82..0000000000000000000000000000000000000000 --- a/include/halco/hicann-dls/vx/neuron_ns_includes.h +++ /dev/null @@ -1,354 +0,0 @@ -struct NeuronConfigOnDLS; -struct NeuronBackendConfigOnDLS; - -using NeuronRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronRowOnDLS; -using NeuronConfigOnNeuronConfigBlock GENPYBIND(visible) = - halco::hicann_dls::vx::NeuronConfigOnNeuronConfigBlock; -using NeuronConfigBlockOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronConfigBlockOnDLS; -using NeuronBackendConfigOnNeuronBackendConfigBlock GENPYBIND(visible) = - halco::hicann_dls::vx::NeuronBackendConfigOnNeuronBackendConfigBlock; -using NeuronBackendConfigBlockOnDLS GENPYBIND(visible) = - halco::hicann_dls::vx::NeuronBackendConfigBlockOnDLS; -using CommonNeuronBackendConfigOnDLS GENPYBIND(visible) = - halco::hicann_dls::vx::CommonNeuronBackendConfigOnDLS; -using NeuronResetOnNeuronResetBlock GENPYBIND(visible) = - halco::hicann_dls::vx::NeuronResetOnNeuronResetBlock; -using NeuronResetBlockOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronResetBlockOnDLS; -using NeuronResetOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronResetOnDLS; -using BlockPostPulseOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::BlockPostPulseOnDLS; -using SpikeCounterReadOnSpikeCounterReadBlock GENPYBIND(visible) = - halco::hicann_dls::vx::SpikeCounterReadOnSpikeCounterReadBlock; -using SpikeCounterReadBlockOnDLS GENPYBIND(visible) = - halco::hicann_dls::vx::SpikeCounterReadBlockOnDLS; -using SpikeCounterReadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SpikeCounterReadOnDLS; -using SpikeCounterResetOnSpikeCounterResetBlock GENPYBIND(visible) = - halco::hicann_dls::vx::SpikeCounterResetOnSpikeCounterResetBlock; -using SpikeCounterResetBlockOnDLS GENPYBIND(visible) = - halco::hicann_dls::vx::SpikeCounterResetBlockOnDLS; -using SpikeCounterResetOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SpikeCounterResetOnDLS; -using NeuronEventOutputOnNeuronBackendBlock GENPYBIND(visible) = - halco::hicann_dls::vx::NeuronEventOutputOnNeuronBackendBlock; -using NeuronEventOutputOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronEventOutputOnDLS; -using NeuronSRAMTimingConfigOnDLS GENPYBIND(visible) = - halco::hicann_dls::vx::NeuronSRAMTimingConfigOnDLS; -using NeuronBackendSRAMTimingConfigOnDLS GENPYBIND(visible) = - halco::hicann_dls::vx::NeuronBackendSRAMTimingConfigOnDLS; -using NeuronRowOnLogicalNeuron = halco::hicann_dls::vx::NeuronRowOnLogicalNeuron; -using NeuronBlockOnDLS = halco::hicann_dls::vx::NeuronBlockOnDLS; - - -/** - * Horizontal neuron location on the two dimensional neuron grid. - */ -struct GENPYBIND(inline_base("*")) NeuronColumnOnDLS - : public common::detail::RantWrapper<NeuronColumnOnDLS, uint_fast16_t, 255, 0> - , public common::detail::XRangedTrait -{ - constexpr explicit NeuronColumnOnDLS(uintmax_t const val = 0) GENPYBIND(implicit_conversion) : - rant_t(val) - {} - - SynapseOnSynapseRow toSynapseOnSynapseRow() const; - CapMemColumnOnCapMemBlock toCapMemColumnOnCapMemBlock() const; - NeuronEventOutputOnDLS toNeuronEventOutputOnDLS() const; -}; - -/** - * DLS-global neuron location on the two dimensional neuron grid. - */ -struct GENPYBIND(inline_base("*")) AtomicNeuronOnDLS - : public common::detail::GridCoordinate<AtomicNeuronOnDLS, NeuronColumnOnDLS, NeuronRowOnDLS> -{ - GRID_COMMON_CONSTRUCTORS(AtomicNeuronOnDLS) - - NeuronColumnOnDLS toNeuronColumnOnDLS() const - { - return x(); - } - NeuronRowOnDLS toNeuronRowOnDLS() const - { - return y(); - } - - NeuronResetOnDLS toNeuronResetOnDLS() const; - SpikeCounterReadOnDLS toSpikeCounterReadOnDLS() const; - SpikeCounterResetOnDLS toSpikeCounterResetOnDLS() const; - NeuronConfigOnDLS toNeuronConfigOnDLS() const; - NeuronBackendConfigOnDLS toNeuronBackendConfigOnDLS() const; - - CapMemBlockOnDLS toCapMemBlockOnDLS() const; - CapMemColumnOnCapMemBlock toCapMemColumnOnCapMemBlock() const; - SynramOnDLS toSynramOnDLS() const; - SynapseQuadColumnOnDLS toSynapseQuadColumnOnDLS() const; - ColumnCorrelationQuadOnDLS toColumnCorrelationQuadOnDLS() const; - ColumnCurrentQuadOnDLS toColumnCurrentQuadOnDLS() const; -}; - - -/** - * Horizontal neuron location on a logical neuron. - */ -struct GENPYBIND(inline_base("*")) NeuronColumnOnLogicalNeuron - : public common::detail::RantWrapper< - NeuronColumnOnLogicalNeuron, - uint_fast16_t, - (NeuronColumnOnDLS::size / NeuronBackendConfigBlockOnDLS::size) - 1, - 0> - , public common::detail::XRangedTrait -{ - constexpr explicit NeuronColumnOnLogicalNeuron(uintmax_t const val = 0) - GENPYBIND(implicit_conversion) : - rant_t(val) - {} -}; - - -/** - * Local neuron location on a logical neuron. - */ -struct GENPYBIND(inline_base("*")) AtomicNeuronOnLogicalNeuron - : public common::detail::GridCoordinate< - AtomicNeuronOnLogicalNeuron, - NeuronColumnOnLogicalNeuron, - NeuronRowOnLogicalNeuron> -{ - GRID_COMMON_CONSTRUCTORS(AtomicNeuronOnLogicalNeuron) - - NeuronColumnOnLogicalNeuron toNeuronColumnOnLogicalNeuron() const - { - return x(); - } - NeuronRowOnLogicalNeuron toNeuronRowOnLogicalNeuron() const - { - return y(); - } - - enum class Direction - { - left, - right, - opposite_row - }; - - /** - * Get neighbor if it exists on the chip. - * @throws OverflowError if neighbor does not exist - * @return AtomicNeuronOnLogicalNeuron - */ - AtomicNeuronOnLogicalNeuron get_neighbor(Direction const& direction) const; -}; - - -/** - * Compartment index. - * Its range is chosen such that the maximally possible number of compartments in a neuron backend - * block can be created. This is size-2, because one compartment has to connect top and bottom row - * and therefore consists of two atomic neuron circuits. - */ -struct GENPYBIND(inline_base("*")) CompartmentOnLogicalNeuron - : public common::detail::RantWrapper< - CompartmentOnLogicalNeuron, - uint_fast16_t, - (AtomicNeuronOnDLS::size / NeuronBackendConfigBlockOnDLS::size) - 2, - 0> -{ - constexpr explicit CompartmentOnLogicalNeuron(uintmax_t const val = 0) - GENPYBIND(implicit_conversion) : - rant_t(val) - {} -}; - - -/** - * Logical neuron compartments. - */ -struct GENPYBIND(visible) LogicalNeuronCompartments -{ - typedef std::vector<AtomicNeuronOnLogicalNeuron> Compartment; - typedef std::map<CompartmentOnLogicalNeuron, Compartment> Compartments; - - LogicalNeuronCompartments() = default; - /** - * Construct logical neuron compartments from compartments. - * The compartment members are to be unique. - * @param compartments Compartments to construct neuron from - */ - explicit LogicalNeuronCompartments(Compartments const& compartments); - - Compartments const& get_compartments() const; - - /** - * Flip locations in the x dimension. - * 1 2 3 4 becomes 4 3 2 1 - * 5 6 6 5 - * @return Flipped compartments - */ - LogicalNeuronCompartments flip_x() const; - - /** - * Flip locations in the y dimension. - * 1 2 3 4 becomes 5 6 - * 5 6 1 2 3 4 - * @return Flipped compartments - */ - LogicalNeuronCompartments flip_y() const; - - NeuronColumnOnLogicalNeuron get_left_most_column() const; - NeuronColumnOnLogicalNeuron get_right_most_column() const; - - NeuronRowOnLogicalNeuron get_top_most_row() const; - NeuronRowOnLogicalNeuron get_bottom_most_row() const; - - bool operator==(LogicalNeuronCompartments const& other) const; - bool operator!=(LogicalNeuronCompartments const& other) const; - - bool operator<(LogicalNeuronCompartments const& other) const; - bool operator>(LogicalNeuronCompartments const& other) const; - bool operator<=(LogicalNeuronCompartments const& other) const; - bool operator>=(LogicalNeuronCompartments const& other) const; - - GENPYBIND(stringstream) - friend std::ostream& operator<<(std::ostream& os, LogicalNeuronCompartments const& config); - -private: - friend class cereal::access; - template <typename Archive> - void serialize(Archive& ar, uint32_t); - - Compartments m_compartments; -}; - - -/** - * Logical neuron location on the neuron grid. - */ -struct GENPYBIND(visible) LogicalNeuronOnDLS -{ - typedef std::map<CompartmentOnLogicalNeuron, std::vector<AtomicNeuronOnDLS>> PlacedCompartments; - - LogicalNeuronOnDLS() = default; - - /** - * Construct logical neuron location from compartments and global anchor. - * The compartments' relative coordinates are anchored at the left top corner. - * @param compartments Compartments to construct neuron from - * @param anchor Anchor to construct neuron from - */ - LogicalNeuronOnDLS( - LogicalNeuronCompartments const& compartments, AtomicNeuronOnDLS const& anchor); - - /** - * Get compartments placed by anchor. - * @return Placed compartments - */ - PlacedCompartments get_placed_compartments() const; - - bool operator==(LogicalNeuronOnDLS const& other) const; - bool operator!=(LogicalNeuronOnDLS const& other) const; - - GENPYBIND(stringstream) - friend std::ostream& operator<<(std::ostream& os, LogicalNeuronOnDLS const& config); - - bool operator<(LogicalNeuronOnDLS const& other) const; - bool operator>(LogicalNeuronOnDLS const& other) const; - bool operator<=(LogicalNeuronOnDLS const& other) const; - bool operator>=(LogicalNeuronOnDLS const& other) const; - -private: - friend class cereal::access; - template <typename Archive> - void serialize(Archive& ar, uint32_t); - - PlacedCompartments m_compartments; -}; - - -HALCO_COORDINATE_MIXIN(NeuronConfigMixin, NeuronConfigBlockOnDLS, neuron) - -struct GENPYBIND(inline_base("*NeuronConfigMixin*")) NeuronConfigOnDLS - : public NeuronConfigMixin<NeuronConfigOnDLS, NeuronConfigOnNeuronConfigBlock> -{ - NeuronConfigOnDLS() = default; - - explicit NeuronConfigOnDLS( - NeuronConfigOnNeuronConfigBlock const& neuron, - NeuronConfigBlockOnDLS const& block = NeuronConfigBlockOnDLS()) : - mixin_t(neuron, block) - {} - - explicit NeuronConfigOnDLS(enum_type const& e) : mixin_t(e) {} - - NeuronConfigOnNeuronConfigBlock toNeuronConfigOnNeuronConfigBlock() const - { - return This(); - } - NeuronResetOnDLS toNeuronResetOnDLS() const; - SpikeCounterReadOnDLS toSpikeCounterReadOnDLS() const; - SpikeCounterResetOnDLS toSpikeCounterResetOnDLS() const; - AtomicNeuronOnDLS toAtomicNeuronOnDLS() const; - SynapseQuadColumnOnDLS toSynapseQuadColumnOnDLS() const; - EntryOnQuad toEntryOnQuad() const; - NeuronRowOnDLS toNeuronRowOnDLS() const; - SynapseOnSynapseRow toSynapseOnSynapseRow() const; - NeuronBackendConfigBlockOnDLS toNeuronBackendConfigBlockOnDLS() const; - NeuronBackendConfigOnNeuronBackendConfigBlock toNeuronBackendConfigOnNeuronBackendConfigBlock() - const; - CommonNeuronBackendConfigOnDLS toCommonNeuronBackendConfigOnDLS() const; - NeuronBackendConfigOnDLS toNeuronBackendConfigOnDLS() const; - SynramOnDLS toSynramOnDLS() const; - ColumnCorrelationQuadOnDLS toColumnCorrelationQuadOnDLS() const; - ColumnCurrentQuadOnDLS toColumnCurrentQuadOnDLS() const; -}; - -struct GENPYBIND(inline_base("*NeuronBackendConfigMixin*")) NeuronBackendConfigOnDLS - : public NeuronBackendConfigMixin< - NeuronBackendConfigOnDLS, - NeuronBackendConfigOnNeuronBackendConfigBlock> -{ - NeuronBackendConfigOnDLS() = default; - - explicit NeuronBackendConfigOnDLS( - NeuronBackendConfigOnNeuronBackendConfigBlock const& neuron, - NeuronBackendConfigBlockOnDLS const& block = NeuronBackendConfigBlockOnDLS()) : - mixin_t(neuron, block) - {} - - explicit NeuronBackendConfigOnDLS(enum_type const& e) : mixin_t(e) {} - - NeuronBackendConfigOnNeuronBackendConfigBlock toNeuronBackendConfigOnNeuronBackendConfigBlock() - const - { - return This(); - } - - NeuronColumnOnDLS toNeuronColumnOnDLS() const; - NeuronRowOnDLS toNeuronRowOnDLS() const; - CommonNeuronBackendConfigOnDLS toCommonNeuronBackendConfigOnDLS() const; - SpikeCounterReadOnDLS toSpikeCounterReadOnDLS() const; - SpikeCounterResetOnDLS toSpikeCounterResetOnDLS() const; - NeuronConfigOnDLS toNeuronConfigOnDLS() const; - AtomicNeuronOnDLS toAtomicNeuronOnDLS() const; - SynramOnDLS toSynramOnDLS() const; - NeuronConfigBlockOnDLS toNeuronConfigBlockOnDLS() const; -}; - -struct GENPYBIND(inline_base("*SynramMixin*")) NeuronResetQuadOnDLS - : public SynramMixin<NeuronResetQuadOnDLS, SynapseQuadColumnOnDLS> -{ - NeuronResetQuadOnDLS() = default; - - explicit NeuronResetQuadOnDLS( - SynapseQuadColumnOnDLS const& quad, SynramOnDLS const& synram = SynramOnDLS()) : - mixin_t(quad, synram) - {} - - explicit NeuronResetQuadOnDLS(enum_type const& e) : mixin_t(e) {} - - SynapseQuadColumnOnDLS toSynapseQuadColumnOnDLS() const - { - return This(); - } - typedef common::typed_array<NeuronResetOnDLS, EntryOnQuad> neuron_reset_type - GENPYBIND(opaque(false)); - neuron_reset_type toNeuronResetOnDLS() const; -}; diff --git a/include/halco/hicann-dls/vx/neuron_ns_includes_impl.h b/include/halco/hicann-dls/vx/neuron_ns_includes_impl.h deleted file mode 100644 index 6626737e9435980c055f027e1d82c4ebf8199710..0000000000000000000000000000000000000000 --- a/include/halco/hicann-dls/vx/neuron_ns_includes_impl.h +++ /dev/null @@ -1,515 +0,0 @@ -NeuronResetOnDLS NeuronConfigOnDLS::toNeuronResetOnDLS() const -{ - auto block = toNeuronConfigBlockOnDLS().toNeuronResetBlockOnDLS(); - return NeuronResetOnDLS( - NeuronResetOnNeuronResetBlock( - toNeuronConfigOnNeuronConfigBlock() + - ((toNeuronConfigBlockOnDLS() / NeuronResetBlockOnDLS::size) - ? NeuronConfigOnNeuronConfigBlock::size - : 0)), - block); -} - -SpikeCounterReadOnDLS NeuronConfigOnDLS::toSpikeCounterReadOnDLS() const -{ - return SpikeCounterReadOnDLS(toNeuronResetOnDLS().toEnum()); -} - -SpikeCounterResetOnDLS NeuronConfigOnDLS::toSpikeCounterResetOnDLS() const -{ - return SpikeCounterResetOnDLS(toNeuronResetOnDLS().toEnum()); -} - -SynapseOnSynapseRow NeuronColumnOnDLS::toSynapseOnSynapseRow() const -{ - return SynapseOnSynapseRow(toEnum()); -} - -CapMemColumnOnCapMemBlock NeuronColumnOnDLS::toCapMemColumnOnCapMemBlock() const -{ - return CapMemColumnOnCapMemBlock(toEnum() % NeuronConfigOnNeuronConfigBlock::size); -} - -NeuronEventOutputOnDLS NeuronColumnOnDLS::toNeuronEventOutputOnDLS() const -{ - return NeuronEventOutputOnDLS(common::Enum(toEnum() / (size / NeuronEventOutputOnDLS::size))); -} - -NeuronConfigOnDLS AtomicNeuronOnDLS::toNeuronConfigOnDLS() const -{ - return NeuronConfigOnDLS(toEnum()); -} - -NeuronResetOnDLS AtomicNeuronOnDLS::toNeuronResetOnDLS() const -{ - return toNeuronConfigOnDLS().toNeuronResetOnDLS(); -} - -SpikeCounterReadOnDLS AtomicNeuronOnDLS::toSpikeCounterReadOnDLS() const -{ - return toNeuronConfigOnDLS().toSpikeCounterReadOnDLS(); -} - -SpikeCounterResetOnDLS AtomicNeuronOnDLS::toSpikeCounterResetOnDLS() const -{ - return toNeuronConfigOnDLS().toSpikeCounterResetOnDLS(); -} - -NeuronBackendConfigOnDLS AtomicNeuronOnDLS::toNeuronBackendConfigOnDLS() const -{ - return NeuronBackendConfigOnDLS(toNeuronResetOnDLS().toEnum()); -} - -CapMemColumnOnCapMemBlock AtomicNeuronOnDLS::toCapMemColumnOnCapMemBlock() const -{ - return toNeuronColumnOnDLS().toCapMemColumnOnCapMemBlock(); -} - -CapMemBlockOnDLS AtomicNeuronOnDLS::toCapMemBlockOnDLS() const -{ - return toNeuronConfigOnDLS().toNeuronConfigBlockOnDLS().toCapMemBlockOnDLS(); -} - -NeuronRowOnDLS NeuronConfigOnDLS::toNeuronRowOnDLS() const -{ - return NeuronRowOnDLS(toEnum() / SynapseOnSynapseRow::size); -} - -SynapseOnSynapseRow NeuronConfigOnDLS::toSynapseOnSynapseRow() const -{ - return SynapseOnSynapseRow(toEnum() % SynapseOnSynapseRow::size); -} - -AtomicNeuronOnDLS NeuronConfigOnDLS::toAtomicNeuronOnDLS() const -{ - return AtomicNeuronOnDLS(toSynapseOnSynapseRow().toNeuronColumnOnDLS(), toNeuronRowOnDLS()); -} - -SynapseQuadColumnOnDLS NeuronConfigOnDLS::toSynapseQuadColumnOnDLS() const -{ - return toSynapseOnSynapseRow().toSynapseQuadColumnOnDLS(); -} - -EntryOnQuad NeuronConfigOnDLS::toEntryOnQuad() const -{ - return toSynapseOnSynapseRow().toEntryOnQuad(); -} - -NeuronBackendConfigBlockOnDLS NeuronConfigOnDLS::toNeuronBackendConfigBlockOnDLS() const -{ - return toAtomicNeuronOnDLS().toNeuronBackendConfigOnDLS().toNeuronBackendConfigBlockOnDLS(); -} - -NeuronBackendConfigOnNeuronBackendConfigBlock -NeuronConfigOnDLS::toNeuronBackendConfigOnNeuronBackendConfigBlock() const -{ - return toAtomicNeuronOnDLS() - .toNeuronBackendConfigOnDLS() - .toNeuronBackendConfigOnNeuronBackendConfigBlock(); -} - -NeuronBackendConfigOnDLS NeuronConfigOnDLS::toNeuronBackendConfigOnDLS() const -{ - return toAtomicNeuronOnDLS().toNeuronBackendConfigOnDLS(); -} - -CommonNeuronBackendConfigOnDLS NeuronConfigOnDLS::toCommonNeuronBackendConfigOnDLS() const -{ - return toNeuronBackendConfigBlockOnDLS().toCommonNeuronBackendConfigOnDLS(); -} - -NeuronColumnOnDLS NeuronBackendConfigOnDLS::toNeuronColumnOnDLS() const -{ - return NeuronColumnOnDLS( - (toNeuronBackendConfigOnNeuronBackendConfigBlock() % - NeuronConfigOnNeuronConfigBlock::size) + - (toNeuronBackendConfigBlockOnDLS() * NeuronConfigOnNeuronConfigBlock::size)); -} - -NeuronRowOnDLS NeuronBackendConfigOnDLS::toNeuronRowOnDLS() const -{ - return NeuronRowOnDLS( - toNeuronBackendConfigOnNeuronBackendConfigBlock() / NeuronConfigOnNeuronConfigBlock::size); -} - -AtomicNeuronOnDLS NeuronBackendConfigOnDLS::toAtomicNeuronOnDLS() const -{ - return AtomicNeuronOnDLS(toNeuronColumnOnDLS(), toNeuronRowOnDLS()); -} - -NeuronConfigOnDLS NeuronBackendConfigOnDLS::toNeuronConfigOnDLS() const -{ - return toAtomicNeuronOnDLS().toNeuronConfigOnDLS(); -} - -SpikeCounterReadOnDLS NeuronBackendConfigOnDLS::toSpikeCounterReadOnDLS() const -{ - return toNeuronConfigOnDLS().toSpikeCounterReadOnDLS(); -} - -SpikeCounterResetOnDLS NeuronBackendConfigOnDLS::toSpikeCounterResetOnDLS() const -{ - return toNeuronConfigOnDLS().toSpikeCounterResetOnDLS(); -} - -CommonNeuronBackendConfigOnDLS NeuronBackendConfigOnDLS::toCommonNeuronBackendConfigOnDLS() const -{ - return toNeuronBackendConfigBlockOnDLS().toCommonNeuronBackendConfigOnDLS(); -} - -SynramOnDLS AtomicNeuronOnDLS::toSynramOnDLS() const -{ - return toNeuronRowOnDLS().toSynramOnDLS(); -} - -SynramOnDLS NeuronConfigOnDLS::toSynramOnDLS() const -{ - return toAtomicNeuronOnDLS().toSynramOnDLS(); -} - -SynramOnDLS NeuronBackendConfigOnDLS::toSynramOnDLS() const -{ - return toAtomicNeuronOnDLS().toSynramOnDLS(); -} - -NeuronConfigBlockOnDLS NeuronBackendConfigOnDLS::toNeuronConfigBlockOnDLS() const -{ - return toNeuronConfigOnDLS().toNeuronConfigBlockOnDLS(); -} - -SynapseQuadColumnOnDLS AtomicNeuronOnDLS::toSynapseQuadColumnOnDLS() const -{ - return toNeuronConfigOnDLS().toSynapseQuadColumnOnDLS(); -} - -ColumnCorrelationQuadOnDLS AtomicNeuronOnDLS::toColumnCorrelationQuadOnDLS() const -{ - return ColumnCorrelationQuadOnDLS( - toSynapseQuadColumnOnDLS().toColumnCorrelationQuadOnSynram(), toSynramOnDLS()); -} - -ColumnCurrentQuadOnDLS AtomicNeuronOnDLS::toColumnCurrentQuadOnDLS() const -{ - return ColumnCurrentQuadOnDLS( - toSynapseQuadColumnOnDLS().toColumnCurrentQuadOnSynram(), toSynramOnDLS()); -} - -ColumnCorrelationQuadOnDLS NeuronConfigOnDLS::toColumnCorrelationQuadOnDLS() const -{ - return toAtomicNeuronOnDLS().toColumnCorrelationQuadOnDLS(); -} - -ColumnCurrentQuadOnDLS NeuronConfigOnDLS::toColumnCurrentQuadOnDLS() const -{ - return toAtomicNeuronOnDLS().toColumnCurrentQuadOnDLS(); -} - -common::typed_array<NeuronResetOnDLS, EntryOnQuad> NeuronResetQuadOnDLS::toNeuronResetOnDLS() const -{ - common::typed_array<NeuronResetOnDLS, EntryOnQuad> ret; - auto const columns = toSynapseQuadColumnOnDLS().toNeuronColumnOnDLS(); - for (auto const e : common::iter_all<EntryOnQuad>()) { - ret[e] = - AtomicNeuronOnDLS(columns[e], toSynramOnDLS().toNeuronRowOnDLS()).toNeuronResetOnDLS(); - } - return ret; -} - -AtomicNeuronOnLogicalNeuron AtomicNeuronOnLogicalNeuron::get_neighbor( - Direction const& direction) const -{ - switch (direction) { - case Direction::left: { - AtomicNeuronOnLogicalNeuron neighbor(NeuronColumnOnLogicalNeuron(x().value() - 1), y()); - return neighbor; - } - case Direction::right: { - AtomicNeuronOnLogicalNeuron neighbor(NeuronColumnOnLogicalNeuron(x().value() + 1), y()); - return neighbor; - } - case Direction::opposite_row: { - AtomicNeuronOnLogicalNeuron neighbor( - x(), NeuronRowOnLogicalNeuron((y().value() + 1) % NeuronRowOnLogicalNeuron::size)); - return neighbor; - } - default: { -#ifndef __ppu__ - throw std::logic_error( - "Unsupported direction for neighbor for AtomicNeuronOnLogicalNeuron was chosen."); -#else - exit(1); -#endif - } - } -} - -LogicalNeuronCompartments::LogicalNeuronCompartments(Compartments const& compartments) -{ - std::set<AtomicNeuronOnLogicalNeuron> unique; - size_t n = 0; - for (auto const& [_, compartment] : compartments) { - unique.insert(compartment.begin(), compartment.end()); - n += compartment.size(); - } - if (unique.size() != n) { -#ifndef __ppu__ - throw std::runtime_error("Multiple compartments contain the same neuron(s)."); -#else - exit(1); -#endif - } - m_compartments = compartments; -} - -LogicalNeuronCompartments::Compartments const& LogicalNeuronCompartments::get_compartments() const -{ - return m_compartments; -} - -NeuronColumnOnLogicalNeuron LogicalNeuronCompartments::get_left_most_column() const -{ - NeuronColumnOnLogicalNeuron lmost(NeuronColumnOnLogicalNeuron::max); - for (auto const& [_, compartment] : m_compartments) { - auto const lm = - std::min_element( - compartment.begin(), compartment.end(), - [](auto const& a, auto const& b) { - return a.toNeuronColumnOnLogicalNeuron() < b.toNeuronColumnOnLogicalNeuron(); - }) - ->toNeuronColumnOnLogicalNeuron(); - lmost = std::min(lm, lmost); - } - return lmost; -} - -NeuronColumnOnLogicalNeuron LogicalNeuronCompartments::get_right_most_column() const -{ - NeuronColumnOnLogicalNeuron rmost(NeuronColumnOnLogicalNeuron::min); - for (auto const& [_, compartment] : m_compartments) { - auto const rm = - std::max_element( - compartment.begin(), compartment.end(), - [](auto const& a, auto const& b) { - return a.toNeuronColumnOnLogicalNeuron() < b.toNeuronColumnOnLogicalNeuron(); - }) - ->toNeuronColumnOnLogicalNeuron(); - rmost = std::max(rm, rmost); - } - return rmost; -} - -NeuronRowOnLogicalNeuron LogicalNeuronCompartments::get_top_most_row() const -{ - NeuronRowOnLogicalNeuron tmost(NeuronRowOnLogicalNeuron::max); - for (auto const& [_, compartment] : m_compartments) { - auto const tm = - std::min_element( - compartment.begin(), compartment.end(), - [](auto const& a, auto const& b) { - return a.toNeuronRowOnLogicalNeuron() < b.toNeuronRowOnLogicalNeuron(); - }) - ->toNeuronRowOnLogicalNeuron(); - tmost = std::min(tm, tmost); - } - return tmost; -} - -NeuronRowOnLogicalNeuron LogicalNeuronCompartments::get_bottom_most_row() const -{ - NeuronRowOnLogicalNeuron bmost(NeuronRowOnLogicalNeuron::min); - for (auto const& [_, compartment] : m_compartments) { - auto const bm = - std::max_element( - compartment.begin(), compartment.end(), - [](auto const& a, auto const& b) { - return a.toNeuronRowOnLogicalNeuron() < b.toNeuronRowOnLogicalNeuron(); - }) - ->toNeuronRowOnLogicalNeuron(); - bmost = std::max(bm, bmost); - } - return bmost; -} - -LogicalNeuronCompartments LogicalNeuronCompartments::flip_x() const -{ - Compartments flipped_compartments; - auto const lmost = get_left_most_column(); - auto const rmost = get_right_most_column(); - for (auto const& [index, compartment] : m_compartments) { - Compartment& flipped_compartment = flipped_compartments[index]; - for (auto const& neuron : compartment) { - flipped_compartment.push_back(AtomicNeuronOnLogicalNeuron( - NeuronColumnOnLogicalNeuron( - lmost.value() + rmost.value() - neuron.toNeuronColumnOnLogicalNeuron().value()), - neuron.toNeuronRowOnLogicalNeuron())); - } - } - return LogicalNeuronCompartments(flipped_compartments); -} - -LogicalNeuronCompartments LogicalNeuronCompartments::flip_y() const -{ - Compartments flipped_compartments; - auto const tmost = get_top_most_row(); - auto const bmost = get_bottom_most_row(); - for (auto const& [index, compartment] : m_compartments) { - Compartment& flipped_compartment = flipped_compartments[index]; - for (auto const& neuron : compartment) { - flipped_compartment.push_back(AtomicNeuronOnLogicalNeuron( - neuron.toNeuronColumnOnLogicalNeuron(), - NeuronRowOnLogicalNeuron( - tmost.value() + bmost.value() - neuron.toNeuronRowOnLogicalNeuron().value()))); - } - } - return LogicalNeuronCompartments(flipped_compartments); -} - -bool LogicalNeuronCompartments::operator==(LogicalNeuronCompartments const& other) const -{ - return m_compartments == other.m_compartments; -} - -bool LogicalNeuronCompartments::operator!=(LogicalNeuronCompartments const& other) const -{ - return !(*this == other); -} - -bool LogicalNeuronCompartments::operator<(LogicalNeuronCompartments const& other) const -{ - return m_compartments < other.m_compartments; -} - -bool LogicalNeuronCompartments::operator>(LogicalNeuronCompartments const& other) const -{ - return m_compartments > other.m_compartments; -} - -bool LogicalNeuronCompartments::operator<=(LogicalNeuronCompartments const& other) const -{ - return m_compartments <= other.m_compartments; -} - -bool LogicalNeuronCompartments::operator>=(LogicalNeuronCompartments const& other) const -{ - return m_compartments >= other.m_compartments; -} - -#ifndef __ppu__ -std::ostream& operator<<(std::ostream& os, LogicalNeuronCompartments const& config) -{ - os << "LogicalNeuronCompartments(\n"; - for (auto const& [index, compartment] : config.m_compartments) { - os << index << "\n"; - for (auto const& neuron : compartment) { - os << "\t" << neuron << "\n"; - } - } - os << ")"; - return os; -} - -template <typename Archive> -void LogicalNeuronCompartments::serialize(Archive& ar, uint32_t const) -{ - ar(m_compartments); -} -#endif - -LogicalNeuronOnDLS::LogicalNeuronOnDLS( - LogicalNeuronCompartments const& compartments, AtomicNeuronOnDLS const& anchor) -{ - auto const lmost = compartments.get_left_most_column(); - auto const rmost = compartments.get_right_most_column(); - auto const bmost = compartments.get_bottom_most_row(); - auto const tmost = compartments.get_top_most_row(); - auto const height = bmost.value() - tmost.value(); - auto const width = rmost.value() - lmost.value(); - - if ((anchor.toNeuronRowOnDLS().value() + height) > NeuronRowOnDLS::max) { -#ifndef __ppu__ - throw std::runtime_error( - "LogicalNeuron anchor results in placement of compartments outside of neuron grid."); -#else - exit(1); -#endif - } - if ((((anchor.toNeuronColumnOnDLS().value()) < NeuronColumnOnLogicalNeuron::max) && - ((anchor.toNeuronColumnOnDLS().value() + width) > NeuronColumnOnLogicalNeuron::max)) || - (((anchor.toNeuronColumnOnDLS().value()) > NeuronColumnOnLogicalNeuron::max) && - ((anchor.toNeuronColumnOnDLS().value() + width) > NeuronColumnOnDLS::max))) { -#ifndef __ppu__ - throw std::runtime_error( - "LogicalNeuron anchor results in placement of compartments outside of neuron grid."); -#else - exit(1); -#endif - } - for (auto const& [index, compartment] : compartments.get_compartments()) { - auto& placed_compartment = m_compartments[index]; - for (auto const& neuron : compartment) { - placed_compartment.push_back(AtomicNeuronOnDLS( - NeuronColumnOnDLS( - anchor.toNeuronColumnOnDLS().value() + - neuron.toNeuronColumnOnLogicalNeuron().value() - lmost.value()), - NeuronRowOnDLS( - anchor.toNeuronRowOnDLS().value() + - neuron.toNeuronRowOnLogicalNeuron().value() - tmost.value()))); - } - } -} - -LogicalNeuronOnDLS::PlacedCompartments LogicalNeuronOnDLS::get_placed_compartments() const -{ - return m_compartments; -} - -bool LogicalNeuronOnDLS::operator==(LogicalNeuronOnDLS const& other) const -{ - return (m_compartments == other.m_compartments); -} - -bool LogicalNeuronOnDLS::operator!=(LogicalNeuronOnDLS const& other) const -{ - return !(*this == other); -} - -bool LogicalNeuronOnDLS::operator<(LogicalNeuronOnDLS const& other) const -{ - return m_compartments < other.m_compartments; -} - -bool LogicalNeuronOnDLS::operator>(LogicalNeuronOnDLS const& other) const -{ - return m_compartments > other.m_compartments; -} - -bool LogicalNeuronOnDLS::operator<=(LogicalNeuronOnDLS const& other) const -{ - return m_compartments <= other.m_compartments; -} - -bool LogicalNeuronOnDLS::operator>=(LogicalNeuronOnDLS const& other) const -{ - return m_compartments >= other.m_compartments; -} - -#ifndef __ppu__ -std::ostream& operator<<(std::ostream& os, LogicalNeuronOnDLS const& config) -{ - os << "LogicalNeuronOnDLS(\n"; - for (auto const& [index, compartment] : config.m_compartments) { - os << index << "\n"; - for (auto const& neuron : compartment) { - os << "\t" << neuron << "\n"; - } - } - os << ")"; - return os; -} - -template <typename Archive> -void LogicalNeuronOnDLS::serialize(Archive& ar, uint32_t const) -{ - ar(m_compartments); -} -#endif diff --git a/include/halco/hicann-dls/vx/switch_rows_ns_includes.h b/include/halco/hicann-dls/vx/switch_rows.h similarity index 85% rename from include/halco/hicann-dls/vx/switch_rows_ns_includes.h rename to include/halco/hicann-dls/vx/switch_rows.h index 093a2e5e11c71d762051bf7b7014e69b3e90ec65..05f5f164b7c1dc1aacaa24158dff55c1801ee15b 100644 --- a/include/halco/hicann-dls/vx/switch_rows_ns_includes.h +++ b/include/halco/hicann-dls/vx/switch_rows.h @@ -1,10 +1,11 @@ -#include <stdint.h> - +#pragma once #include "halco/common/genpybind.h" #include "halco/common/geometry.h" - #include "halco/hicann-dls/vx/synapse.h" #include "halco/hicann-dls/vx/synram.h" +#include <stdint.h> + +namespace halco::hicann_dls::vx GENPYBIND_TAG_HALCO_HICANN_DLS_VX { /************************\ ColumnCorrelationQuad @@ -100,3 +101,14 @@ struct GENPYBIND(inline_base("*SynramMixin*")) ColumnCurrentQuadOnDLS return This(); } }; + +} // namespace halco::hicann_dls::vx::v3 + +namespace std { + +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::ColumnCorrelationQuadOnSynram) +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::ColumnCurrentQuadOnSynram) +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::ColumnCorrelationQuadOnDLS) +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::ColumnCurrentQuadOnDLS) + +} // namespace std diff --git a/include/halco/hicann-dls/vx/synapse.h b/include/halco/hicann-dls/vx/synapse.h index dbfc335516d689a780c4e2fa963c75fceec70e5f..96c00f6f28fa017d2b7bdad05b8e94b0deaab9a0 100644 --- a/include/halco/hicann-dls/vx/synapse.h +++ b/include/halco/hicann-dls/vx/synapse.h @@ -17,6 +17,15 @@ struct SynapseRowOnDLS; struct SynapseWeightRowOnDLS; struct SynapseLabelRowOnDLS; struct SynapseCorrelationCalibRowOnDLS; +struct ColumnCorrelationQuadOnSynram; +struct ColumnCurrentQuadOnSynram; +struct NeuronColumnOnDLS; +struct SynapseQuadOnDLS; +struct SynapseWeightQuadOnDLS; +struct SynapseLabelQuadOnDLS; +struct SynapseCorrelationCalibQuadOnDLS; +struct SynapseRowOnSynram; +struct CADCChannelColumnOnSynram; /***********\ Synapse @@ -259,6 +268,209 @@ struct GENPYBIND(inline_base("*")) SynapseBlockOnDLS static const SynapseBlockOnDLS bottom; }; + +struct GENPYBIND(inline_base("*")) SynapseQuadColumnOnDLS + : public common::detail::RantWrapper<SynapseQuadColumnOnDLS, uint_fast16_t, 63, 0> + , public common::detail::XRangedTrait +{ + constexpr explicit SynapseQuadColumnOnDLS(uintmax_t const val = 0) + GENPYBIND(implicit_conversion) : + rant_t(val) + {} + + constexpr explicit SynapseQuadColumnOnDLS(common::X const& x) GENPYBIND(implicit_conversion) : + rant_t(x) + {} + + ColumnCorrelationQuadOnSynram toColumnCorrelationQuadOnSynram() const; + ColumnCurrentQuadOnSynram toColumnCurrentQuadOnSynram() const; + typedef common::typed_array<NeuronColumnOnDLS, EntryOnQuad> neuron_column_type + GENPYBIND(opaque(false)); + neuron_column_type toNeuronColumnOnDLS() const; +}; + +struct GENPYBIND(inline_base("*")) SynapseQuadOnSynram + : public common::detail:: + GridCoordinate<SynapseQuadOnSynram, SynapseQuadColumnOnDLS, SynapseRowOnSynram> +{ + GRID_COMMON_CONSTRUCTORS(SynapseQuadOnSynram) + + SynapseQuadColumnOnDLS toSynapseQuadColumnOnDLS() const + { + return x(); + } + SynapseRowOnSynram toSynapseRowOnSynram() const + { + return y(); + } +}; + +struct GENPYBIND(inline_base("*SynramMixin*")) SynapseQuadOnDLS + : public SynramMixin<SynapseQuadOnDLS, SynapseQuadOnSynram> +{ + SynapseQuadOnDLS() = default; + + explicit SynapseQuadOnDLS( + SynapseQuadOnSynram const& block, SynramOnDLS const& synram = SynramOnDLS()) : + mixin_t(block, synram) + {} + + explicit SynapseQuadOnDLS(enum_type const& e) : mixin_t(e) {} + + SynapseQuadOnSynram toSynapseQuadOnSynram() const + { + return This(); + } + + NeuronConfigBlockOnDLS toNeuronConfigBlockOnDLS() const; + SynapseWeightQuadOnDLS toSynapseWeightQuadOnDLS() const; + SynapseLabelQuadOnDLS toSynapseLabelQuadOnDLS() const; + SynapseCorrelationCalibQuadOnDLS toSynapseCorrelationCalibQuadOnDLS() const; +}; + +struct GENPYBIND(inline_base("*SynramMixin*")) CorrelationResetOnDLS + : public SynramMixin<CorrelationResetOnDLS, SynapseQuadOnSynram> +{ + CorrelationResetOnDLS() = default; + + explicit CorrelationResetOnDLS( + SynapseQuadOnSynram const& block, SynramOnDLS const& synram = SynramOnDLS()) : + mixin_t(block, synram) + {} + + explicit CorrelationResetOnDLS(enum_type const& e) : mixin_t(e) {} + + SynapseQuadOnSynram toSynapseQuadOnSynram() const + { + return This(); + } +}; + +struct GENPYBIND(inline_base("*SynramMixin*")) SynapseWeightQuadOnDLS + : public SynramMixin<SynapseWeightQuadOnDLS, SynapseQuadOnSynram> +{ + SynapseWeightQuadOnDLS() = default; + + explicit SynapseWeightQuadOnDLS( + SynapseQuadOnSynram const& block, SynramOnDLS const& synram = SynramOnDLS()) : + mixin_t(block, synram) + {} + + explicit SynapseWeightQuadOnDLS(enum_type const& e) : mixin_t(e) {} + + SynapseQuadOnSynram toSynapseQuadOnSynram() const + { + return This(); + } + + NeuronConfigBlockOnDLS toNeuronConfigBlockOnDLS() const; + SynapseQuadOnDLS toSynapseQuadOnDLS() const; + SynapseLabelQuadOnDLS toSynapseLabelQuadOnDLS() const; + SynapseCorrelationCalibQuadOnDLS toSynapseCorrelationCalibQuadOnDLS() const; +}; + + +struct GENPYBIND(inline_base("*SynramMixin*")) SynapseLabelQuadOnDLS + : public SynramMixin<SynapseLabelQuadOnDLS, SynapseQuadOnSynram> +{ + SynapseLabelQuadOnDLS() = default; + + explicit SynapseLabelQuadOnDLS( + SynapseQuadOnSynram const& block, SynramOnDLS const& synram = SynramOnDLS()) : + mixin_t(block, synram) + {} + + explicit SynapseLabelQuadOnDLS(enum_type const& e) : mixin_t(e) {} + + SynapseQuadOnSynram toSynapseQuadOnSynram() const + { + return This(); + } + + NeuronConfigBlockOnDLS toNeuronConfigBlockOnDLS() const; + SynapseWeightQuadOnDLS toSynapseWeightQuadOnDLS() const; + SynapseQuadOnDLS toSynapseQuadOnDLS() const; + SynapseCorrelationCalibQuadOnDLS toSynapseCorrelationCalibQuadOnDLS() const; +}; + + +struct GENPYBIND(inline_base("*SynramMixin*")) SynapseCorrelationCalibQuadOnDLS + : public SynramMixin<SynapseCorrelationCalibQuadOnDLS, SynapseQuadOnSynram> +{ + SynapseCorrelationCalibQuadOnDLS() = default; + + explicit SynapseCorrelationCalibQuadOnDLS( + SynapseQuadOnSynram const& block, SynramOnDLS const& synram = SynramOnDLS()) : + mixin_t(block, synram) + {} + + explicit SynapseCorrelationCalibQuadOnDLS(enum_type const& e) : mixin_t(e) {} + + SynapseQuadOnSynram toSynapseQuadOnSynram() const + { + return This(); + } + + NeuronConfigBlockOnDLS toNeuronConfigBlockOnDLS() const; + SynapseWeightQuadOnDLS toSynapseWeightQuadOnDLS() const; + SynapseLabelQuadOnDLS toSynapseLabelQuadOnDLS() const; + SynapseQuadOnDLS toSynapseQuadOnDLS() const; +}; + + +struct GENPYBIND(inline_base("*")) SynapseOnSynapseRow + : public common::detail::RantWrapper<SynapseOnSynapseRow, uint_fast16_t, 255, 0> + , public common::detail::XRangedTrait +{ + constexpr explicit SynapseOnSynapseRow(uintmax_t const value = 0) + GENPYBIND(implicit_conversion) : + rant_t(value) + {} + + explicit SynapseOnSynapseRow( + EntryOnQuad const& syn_on_quad, SynapseQuadColumnOnDLS const& quad); + + EntryOnQuad toEntryOnQuad() const; + SynapseQuadColumnOnDLS toSynapseQuadColumnOnDLS() const; + NeuronColumnOnDLS toNeuronColumnOnDLS() const; + CADCChannelColumnOnSynram toCADCChannelColumnOnSynram() const; +}; + +struct GENPYBIND(inline_base("*")) SynapseOnSynram + : public common::detail:: + GridCoordinate<SynapseOnSynram, SynapseOnSynapseRow, SynapseRowOnSynram> +{ + GRID_COMMON_CONSTRUCTORS(SynapseOnSynram) + + SynapseOnSynapseRow toSynapseOnSynapseRow() const + { + return x(); + } + + SynapseRowOnSynram toSynapseRowOnSynram() const + { + return y(); + } +}; + +struct GENPYBIND(inline_base("*SynramMixin*")) SynapseOnDLS + : public SynramMixin<SynapseOnDLS, SynapseOnSynram> +{ + SynapseOnDLS() = default; + + explicit SynapseOnDLS( + SynapseOnSynram const& synapse, SynramOnDLS const& synram = SynramOnDLS()) : + mixin_t(synapse, synram) + {} + + explicit SynapseOnDLS(enum_type const& e) : mixin_t(e) {} + + SynapseOnSynram toSynapseOnSynram() const + { + return This(); + } +}; + } // namespace halco::hicann_dls::vx namespace std { @@ -277,5 +489,15 @@ HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::SynapseWeightMatrixOnDLS) HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::SynapseLabelMatrixOnDLS) HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::SynapseCorrelationCalibMatrixOnDLS) HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::SynapseBlockOnDLS) +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::SynapseQuadColumnOnDLS) +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::SynapseQuadOnSynram) +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::SynapseOnSynapseRow) +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::SynapseOnSynram) +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::SynapseOnDLS) +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::SynapseQuadOnDLS) +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::SynapseWeightQuadOnDLS) +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::SynapseLabelQuadOnDLS) +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::SynapseCorrelationCalibQuadOnDLS) +HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::CorrelationResetOnDLS) } // namespace std diff --git a/include/halco/hicann-dls/vx/synapse_ns_includes.h b/include/halco/hicann-dls/vx/synapse_ns_includes.h deleted file mode 100644 index 888c576238ea9a64cdfc6ea9f613350c48aa4dd1..0000000000000000000000000000000000000000 --- a/include/halco/hicann-dls/vx/synapse_ns_includes.h +++ /dev/null @@ -1,176 +0,0 @@ -struct ColumnCorrelationQuadOnSynram; -struct ColumnCurrentQuadOnSynram; -struct NeuronColumnOnDLS; -struct SynapseQuadOnDLS; -struct SynapseWeightQuadOnDLS; -struct SynapseLabelQuadOnDLS; -struct SynapseCorrelationCalibQuadOnDLS; - -using SynapseRowOnSynapseDriver GENPYBIND(visible) = - halco::hicann_dls::vx::SynapseRowOnSynapseDriver; -using SynapseRowOnSynram GENPYBIND(visible) = halco::hicann_dls::vx::SynapseRowOnSynram; -using SynapseRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseRowOnDLS; -using SynapseWeightRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseWeightRowOnDLS; -using SynapseLabelRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseLabelRowOnDLS; -using SynapseCorrelationCalibRowOnDLS GENPYBIND(visible) = - halco::hicann_dls::vx::SynapseCorrelationCalibRowOnDLS; -using CorrelationResetRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CorrelationResetRowOnDLS; -using ColumnCorrelationRowOnDLS GENPYBIND(visible) = - halco::hicann_dls::vx::ColumnCorrelationRowOnDLS; -using ColumnCurrentRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::ColumnCurrentRowOnDLS; -using SynapticInputOnNeuron GENPYBIND(visible) = halco::hicann_dls::vx::SynapticInputOnNeuron; -using SynapseBiasSelectionOnDLS GENPYBIND(visible) = - halco::hicann_dls::vx::SynapseBiasSelectionOnDLS; -using SynapseWeightMatrixOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseWeightMatrixOnDLS; -using SynapseLabelMatrixOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseLabelMatrixOnDLS; -using SynapseCorrelationCalibMatrixOnDLS GENPYBIND(visible) = - halco::hicann_dls::vx::SynapseCorrelationCalibMatrixOnDLS; -using SynapseBlockOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseBlockOnDLS; - -struct GENPYBIND(inline_base("*")) SynapseQuadColumnOnDLS - : public common::detail::RantWrapper<SynapseQuadColumnOnDLS, uint_fast16_t, 63, 0> - , public common::detail::XRangedTrait -{ - constexpr explicit SynapseQuadColumnOnDLS(uintmax_t const val = 0) - GENPYBIND(implicit_conversion) : - rant_t(val) - {} - - constexpr explicit SynapseQuadColumnOnDLS(common::X const& x) GENPYBIND(implicit_conversion) : - rant_t(x) - {} - - ColumnCorrelationQuadOnSynram toColumnCorrelationQuadOnSynram() const; - ColumnCurrentQuadOnSynram toColumnCurrentQuadOnSynram() const; - typedef common::typed_array<NeuronColumnOnDLS, EntryOnQuad> neuron_column_type - GENPYBIND(opaque(false)); - neuron_column_type toNeuronColumnOnDLS() const; -}; - -struct GENPYBIND(inline_base("*")) SynapseQuadOnSynram - : public common::detail:: - GridCoordinate<SynapseQuadOnSynram, SynapseQuadColumnOnDLS, SynapseRowOnSynram> -{ - GRID_COMMON_CONSTRUCTORS(SynapseQuadOnSynram) - - SynapseQuadColumnOnDLS toSynapseQuadColumnOnDLS() const - { - return x(); - } - SynapseRowOnSynram toSynapseRowOnSynram() const - { - return y(); - } -}; - -struct GENPYBIND(inline_base("*SynramMixin*")) SynapseQuadOnDLS - : public SynramMixin<SynapseQuadOnDLS, SynapseQuadOnSynram> -{ - SynapseQuadOnDLS() = default; - - explicit SynapseQuadOnDLS( - SynapseQuadOnSynram const& block, SynramOnDLS const& synram = SynramOnDLS()) : - mixin_t(block, synram) - {} - - explicit SynapseQuadOnDLS(enum_type const& e) : mixin_t(e) {} - - SynapseQuadOnSynram toSynapseQuadOnSynram() const - { - return This(); - } - - NeuronConfigBlockOnDLS toNeuronConfigBlockOnDLS() const; - SynapseWeightQuadOnDLS toSynapseWeightQuadOnDLS() const; - SynapseLabelQuadOnDLS toSynapseLabelQuadOnDLS() const; - SynapseCorrelationCalibQuadOnDLS toSynapseCorrelationCalibQuadOnDLS() const; -}; - -struct GENPYBIND(inline_base("*SynramMixin*")) CorrelationResetOnDLS - : public SynramMixin<CorrelationResetOnDLS, SynapseQuadOnSynram> -{ - CorrelationResetOnDLS() = default; - - explicit CorrelationResetOnDLS( - SynapseQuadOnSynram const& block, SynramOnDLS const& synram = SynramOnDLS()) : - mixin_t(block, synram) - {} - - explicit CorrelationResetOnDLS(enum_type const& e) : mixin_t(e) {} - - SynapseQuadOnSynram toSynapseQuadOnSynram() const - { - return This(); - } -}; - -struct GENPYBIND(inline_base("*SynramMixin*")) SynapseWeightQuadOnDLS - : public SynramMixin<SynapseWeightQuadOnDLS, SynapseQuadOnSynram> -{ - SynapseWeightQuadOnDLS() = default; - - explicit SynapseWeightQuadOnDLS( - SynapseQuadOnSynram const& block, SynramOnDLS const& synram = SynramOnDLS()) : - mixin_t(block, synram) - {} - - explicit SynapseWeightQuadOnDLS(enum_type const& e) : mixin_t(e) {} - - SynapseQuadOnSynram toSynapseQuadOnSynram() const - { - return This(); - } - - NeuronConfigBlockOnDLS toNeuronConfigBlockOnDLS() const; - SynapseQuadOnDLS toSynapseQuadOnDLS() const; - SynapseLabelQuadOnDLS toSynapseLabelQuadOnDLS() const; - SynapseCorrelationCalibQuadOnDLS toSynapseCorrelationCalibQuadOnDLS() const; -}; - - -struct GENPYBIND(inline_base("*SynramMixin*")) SynapseLabelQuadOnDLS - : public SynramMixin<SynapseLabelQuadOnDLS, SynapseQuadOnSynram> -{ - SynapseLabelQuadOnDLS() = default; - - explicit SynapseLabelQuadOnDLS( - SynapseQuadOnSynram const& block, SynramOnDLS const& synram = SynramOnDLS()) : - mixin_t(block, synram) - {} - - explicit SynapseLabelQuadOnDLS(enum_type const& e) : mixin_t(e) {} - - SynapseQuadOnSynram toSynapseQuadOnSynram() const - { - return This(); - } - - NeuronConfigBlockOnDLS toNeuronConfigBlockOnDLS() const; - SynapseWeightQuadOnDLS toSynapseWeightQuadOnDLS() const; - SynapseQuadOnDLS toSynapseQuadOnDLS() const; - SynapseCorrelationCalibQuadOnDLS toSynapseCorrelationCalibQuadOnDLS() const; -}; - - -struct GENPYBIND(inline_base("*SynramMixin*")) SynapseCorrelationCalibQuadOnDLS - : public SynramMixin<SynapseCorrelationCalibQuadOnDLS, SynapseQuadOnSynram> -{ - SynapseCorrelationCalibQuadOnDLS() = default; - - explicit SynapseCorrelationCalibQuadOnDLS( - SynapseQuadOnSynram const& block, SynramOnDLS const& synram = SynramOnDLS()) : - mixin_t(block, synram) - {} - - explicit SynapseCorrelationCalibQuadOnDLS(enum_type const& e) : mixin_t(e) {} - - SynapseQuadOnSynram toSynapseQuadOnSynram() const - { - return This(); - } - - NeuronConfigBlockOnDLS toNeuronConfigBlockOnDLS() const; - SynapseWeightQuadOnDLS toSynapseWeightQuadOnDLS() const; - SynapseLabelQuadOnDLS toSynapseLabelQuadOnDLS() const; - SynapseQuadOnDLS toSynapseQuadOnDLS() const; -}; diff --git a/include/halco/hicann-dls/vx/synapse_ns_includes_impl.h b/include/halco/hicann-dls/vx/synapse_ns_includes_impl.h deleted file mode 100644 index 877354ff727b1e4b1c32779c2b8e0c1ee1768683..0000000000000000000000000000000000000000 --- a/include/halco/hicann-dls/vx/synapse_ns_includes_impl.h +++ /dev/null @@ -1,94 +0,0 @@ -ColumnCorrelationQuadOnSynram SynapseQuadColumnOnDLS::toColumnCorrelationQuadOnSynram() const -{ - return ColumnCorrelationQuadOnSynram(toEnum()); -} - -ColumnCurrentQuadOnSynram SynapseQuadColumnOnDLS::toColumnCurrentQuadOnSynram() const -{ - return ColumnCurrentQuadOnSynram(toEnum()); -} - -SynapseWeightQuadOnDLS SynapseQuadOnDLS::toSynapseWeightQuadOnDLS() const -{ - return SynapseWeightQuadOnDLS(toEnum()); -} - -SynapseLabelQuadOnDLS SynapseQuadOnDLS::toSynapseLabelQuadOnDLS() const -{ - return SynapseLabelQuadOnDLS(toEnum()); -} - -SynapseCorrelationCalibQuadOnDLS SynapseQuadOnDLS::toSynapseCorrelationCalibQuadOnDLS() const -{ - return SynapseCorrelationCalibQuadOnDLS(toEnum()); -} - -NeuronConfigBlockOnDLS SynapseWeightQuadOnDLS::toNeuronConfigBlockOnDLS() const -{ - return toSynapseQuadOnDLS().toNeuronConfigBlockOnDLS(); -} - -SynapseQuadOnDLS SynapseWeightQuadOnDLS::toSynapseQuadOnDLS() const -{ - return SynapseQuadOnDLS(toEnum()); -} - -SynapseLabelQuadOnDLS SynapseWeightQuadOnDLS::toSynapseLabelQuadOnDLS() const -{ - return SynapseLabelQuadOnDLS(toEnum()); -} - -SynapseCorrelationCalibQuadOnDLS SynapseWeightQuadOnDLS::toSynapseCorrelationCalibQuadOnDLS() const -{ - return SynapseCorrelationCalibQuadOnDLS(toEnum()); -} - -NeuronConfigBlockOnDLS SynapseLabelQuadOnDLS::toNeuronConfigBlockOnDLS() const -{ - return toSynapseQuadOnDLS().toNeuronConfigBlockOnDLS(); -} - -SynapseWeightQuadOnDLS SynapseLabelQuadOnDLS::toSynapseWeightQuadOnDLS() const -{ - return SynapseWeightQuadOnDLS(toEnum()); -} - -SynapseQuadOnDLS SynapseLabelQuadOnDLS::toSynapseQuadOnDLS() const -{ - return SynapseQuadOnDLS(toEnum()); -} - -SynapseCorrelationCalibQuadOnDLS SynapseLabelQuadOnDLS::toSynapseCorrelationCalibQuadOnDLS() const -{ - return SynapseCorrelationCalibQuadOnDLS(toEnum()); -} - -NeuronConfigBlockOnDLS SynapseCorrelationCalibQuadOnDLS::toNeuronConfigBlockOnDLS() const -{ - return toSynapseQuadOnDLS().toNeuronConfigBlockOnDLS(); -} - -SynapseWeightQuadOnDLS SynapseCorrelationCalibQuadOnDLS::toSynapseWeightQuadOnDLS() const -{ - return SynapseWeightQuadOnDLS(toEnum()); -} - -SynapseLabelQuadOnDLS SynapseCorrelationCalibQuadOnDLS::toSynapseLabelQuadOnDLS() const -{ - return SynapseLabelQuadOnDLS(toEnum()); -} - -SynapseQuadOnDLS SynapseCorrelationCalibQuadOnDLS::toSynapseQuadOnDLS() const -{ - return SynapseQuadOnDLS(toEnum()); -} - -NeuronColumnOnDLS SynapseOnSynapseRow::toNeuronColumnOnDLS() const -{ - return NeuronColumnOnDLS(toEnum()); -} - -CADCChannelColumnOnSynram SynapseOnSynapseRow::toCADCChannelColumnOnSynram() const -{ - return CADCChannelColumnOnSynram(toEnum()); -} diff --git a/include/halco/hicann-dls/vx/v2/cadc.h b/include/halco/hicann-dls/vx/v2/cadc.h index d09fe4cf8bcf0ebec4e532e7dd94fda1f12c17da..b6e6ee1c076569f6ad7dd6c387c4a4fa15146dd7 100644 --- a/include/halco/hicann-dls/vx/v2/cadc.h +++ b/include/halco/hicann-dls/vx/v2/cadc.h @@ -1,20 +1,25 @@ #pragma once #include "halco/common/genpybind.h" #include "halco/hicann-dls/vx/cadc.h" -#include "halco/hicann-dls/vx/v2/synapse.h" namespace halco::hicann_dls::vx::v2 GENPYBIND_TAG_HALCO_HICANN_DLS_VX_V2 { -#include "halco/hicann-dls/vx/cadc_ns_includes.h" +using CADCOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCOnDLS; +using CADCConfigOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCConfigOnDLS; +using CADCChannelType GENPYBIND(visible) = halco::hicann_dls::vx::CADCChannelType; +using CADCReadoutType GENPYBIND(visible) = halco::hicann_dls::vx::CADCReadoutType; +using CADCChannelColumnOnSynram GENPYBIND(visible) = + halco::hicann_dls::vx::CADCChannelColumnOnSynram; +using CADCSampleRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCSampleRowOnDLS; +using CADCOffsetSRAMTimingConfigOnDLS GENPYBIND(visible) = + halco::hicann_dls::vx::CADCOffsetSRAMTimingConfigOnDLS; +using CADCSamplesOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCSamplesOnDLS; +using CADCSampleQuadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCSampleQuadOnDLS; +using CADCChannelConfigOnSynram GENPYBIND(visible) = + halco::hicann_dls::vx::CADCChannelConfigOnSynram; +using CADCChannelConfigOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCChannelConfigOnDLS; +using CADCSampleQuadUnspecifiedReadoutOnSynram GENPYBIND(visible) = + halco::hicann_dls::vx::CADCSampleQuadUnspecifiedReadoutOnSynram; +using CADCSampleQuadOnSynram GENPYBIND(visible) = halco::hicann_dls::vx::CADCSampleQuadOnSynram; } // namespace halco::hicann_dls::vx::v2 - -namespace std { - -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::CADCSampleQuadOnDLS) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::CADCChannelConfigOnSynram) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::CADCChannelConfigOnDLS) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::CADCSampleQuadUnspecifiedReadoutOnSynram) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::CADCSampleQuadOnSynram) - -} // namespace std diff --git a/include/halco/hicann-dls/vx/v2/neuron.h b/include/halco/hicann-dls/vx/v2/neuron.h index 959972c127ab9a7440392550ecf743df62c4d6bd..e3c4c3a079bf6ccb687487487350f389a1a813a7 100644 --- a/include/halco/hicann-dls/vx/v2/neuron.h +++ b/include/halco/hicann-dls/vx/v2/neuron.h @@ -2,34 +2,56 @@ #include "halco/common/genpybind.h" #include "halco/common/iter_all.h" #include "halco/hicann-dls/vx/neuron.h" -#include "halco/hicann-dls/vx/v2/cadc.h" -#include "halco/hicann-dls/vx/v2/capmem.h" -#include "halco/hicann-dls/vx/v2/chip.h" -#include "halco/hicann-dls/vx/v2/correlation.h" -#include "halco/hicann-dls/vx/v2/padi.h" -#include "halco/hicann-dls/vx/v2/ppu.h" -#include "halco/hicann-dls/vx/v2/routing_crossbar.h" -#include "halco/hicann-dls/vx/v2/switch_rows.h" -#include "halco/hicann-dls/vx/v2/synapse.h" -#include "halco/hicann-dls/vx/v2/synapse_driver.h" -#include "halco/hicann-dls/vx/v2/synram.h" - -namespace cereal { -class access; -} // namespace cereal namespace halco::hicann_dls::vx::v2 GENPYBIND_TAG_HALCO_HICANN_DLS_VX_V2 { -#include "halco/hicann-dls/vx/neuron_ns_includes.h" +using NeuronRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronRowOnDLS; +using NeuronConfigOnNeuronConfigBlock GENPYBIND(visible) = + halco::hicann_dls::vx::NeuronConfigOnNeuronConfigBlock; +using NeuronConfigBlockOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronConfigBlockOnDLS; +using NeuronBackendConfigOnNeuronBackendConfigBlock GENPYBIND(visible) = + halco::hicann_dls::vx::NeuronBackendConfigOnNeuronBackendConfigBlock; +using NeuronBackendConfigBlockOnDLS GENPYBIND(visible) = + halco::hicann_dls::vx::NeuronBackendConfigBlockOnDLS; +using CommonNeuronBackendConfigOnDLS GENPYBIND(visible) = + halco::hicann_dls::vx::CommonNeuronBackendConfigOnDLS; +using NeuronResetOnNeuronResetBlock GENPYBIND(visible) = + halco::hicann_dls::vx::NeuronResetOnNeuronResetBlock; +using NeuronResetBlockOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronResetBlockOnDLS; +using NeuronResetOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronResetOnDLS; +using BlockPostPulseOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::BlockPostPulseOnDLS; +using SpikeCounterReadOnSpikeCounterReadBlock GENPYBIND(visible) = + halco::hicann_dls::vx::SpikeCounterReadOnSpikeCounterReadBlock; +using SpikeCounterReadBlockOnDLS GENPYBIND(visible) = + halco::hicann_dls::vx::SpikeCounterReadBlockOnDLS; +using SpikeCounterReadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SpikeCounterReadOnDLS; +using SpikeCounterResetOnSpikeCounterResetBlock GENPYBIND(visible) = + halco::hicann_dls::vx::SpikeCounterResetOnSpikeCounterResetBlock; +using SpikeCounterResetBlockOnDLS GENPYBIND(visible) = + halco::hicann_dls::vx::SpikeCounterResetBlockOnDLS; +using SpikeCounterResetOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SpikeCounterResetOnDLS; +using NeuronEventOutputOnNeuronBackendBlock GENPYBIND(visible) = + halco::hicann_dls::vx::NeuronEventOutputOnNeuronBackendBlock; +using NeuronEventOutputOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronEventOutputOnDLS; +using NeuronSRAMTimingConfigOnDLS GENPYBIND(visible) = + halco::hicann_dls::vx::NeuronSRAMTimingConfigOnDLS; +using NeuronBackendSRAMTimingConfigOnDLS GENPYBIND(visible) = + halco::hicann_dls::vx::NeuronBackendSRAMTimingConfigOnDLS; +using NeuronRowOnLogicalNeuron = halco::hicann_dls::vx::NeuronRowOnLogicalNeuron; +using NeuronBlockOnDLS = halco::hicann_dls::vx::NeuronBlockOnDLS; +using NeuronColumnOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronColumnOnDLS; +using AtomicNeuronOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::AtomicNeuronOnDLS; +using NeuronConfigOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronConfigOnDLS; +using NeuronBackendConfigOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronBackendConfigOnDLS; +using NeuronResetQuadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronResetQuadOnDLS; +using LogicalNeuronOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::LogicalNeuronOnDLS; +using LogicalNeuronCompartments GENPYBIND(visible) = + halco::hicann_dls::vx::LogicalNeuronCompartments; +using AtomicNeuronOnLogicalNeuron GENPYBIND(visible) = + halco::hicann_dls::vx::AtomicNeuronOnLogicalNeuron; +using NeuronColumnOnLogicalNeuron GENPYBIND(visible) = + halco::hicann_dls::vx::NeuronColumnOnLogicalNeuron; +using CompartmentOnLogicalNeuron GENPYBIND(visible) = + halco::hicann_dls::vx::CompartmentOnLogicalNeuron; } // namespace halco::hicann_dls::vx::v2 - -namespace std { - -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::NeuronColumnOnDLS) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::AtomicNeuronOnDLS) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::NeuronConfigOnDLS) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::NeuronBackendConfigOnDLS) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::NeuronResetQuadOnDLS) - -} // namespace std diff --git a/include/halco/hicann-dls/vx/v2/switch_rows.h b/include/halco/hicann-dls/vx/v2/switch_rows.h index b732122d6e5d6369323a0d43051e6a0567bb3971..dc65b5b4f541e246835661a5a1b5e9a7cf205296 100644 --- a/include/halco/hicann-dls/vx/v2/switch_rows.h +++ b/include/halco/hicann-dls/vx/v2/switch_rows.h @@ -1,19 +1,15 @@ #pragma once #include "halco/common/genpybind.h" -#include "halco/hicann-dls/vx/v2/synapse.h" -#include "halco/hicann-dls/vx/v2/synram.h" +#include "halco/hicann-dls/vx/switch_rows.h" namespace halco::hicann_dls::vx::v2 GENPYBIND_TAG_HALCO_HICANN_DLS_VX_V2 { -#include "halco/hicann-dls/vx/switch_rows_ns_includes.h" +using ColumnCorrelationQuadOnSynram GENPYBIND(visible) = + halco::hicann_dls::vx::ColumnCorrelationQuadOnSynram; +using ColumnCurrentQuadOnSynram GENPYBIND(visible) = + halco::hicann_dls::vx::ColumnCurrentQuadOnSynram; +using ColumnCorrelationQuadOnDLS GENPYBIND(visible) = + halco::hicann_dls::vx::ColumnCorrelationQuadOnDLS; +using ColumnCurrentQuadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::ColumnCurrentQuadOnDLS; } // namespace halco::hicann_dls::vx::v2 - -namespace std { - -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::ColumnCorrelationQuadOnSynram) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::ColumnCurrentQuadOnSynram) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::ColumnCorrelationQuadOnDLS) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::ColumnCurrentQuadOnDLS) - -} // namespace std diff --git a/include/halco/hicann-dls/vx/v2/synapse.h b/include/halco/hicann-dls/vx/v2/synapse.h index 16e763f8e32c23a36ae25f56a8382169df6b819e..0385a8cff750c78215f3696064922b9a5da6d603 100644 --- a/include/halco/hicann-dls/vx/v2/synapse.h +++ b/include/halco/hicann-dls/vx/v2/synapse.h @@ -2,79 +2,39 @@ #include "halco/common/genpybind.h" #include "halco/hicann-dls/vx/cadc.h" #include "halco/hicann-dls/vx/synapse.h" -#include "halco/hicann-dls/vx/v2/quad.h" -#include "halco/hicann-dls/vx/v2/synram.h" namespace halco::hicann_dls::vx::v2 GENPYBIND_TAG_HALCO_HICANN_DLS_VX_V2 { -#include "halco/hicann-dls/vx/synapse_ns_includes.h" - -struct GENPYBIND(inline_base("*")) SynapseOnSynapseRow - : public common::detail::RantWrapper<SynapseOnSynapseRow, uint_fast16_t, 255, 0> - , public common::detail::XRangedTrait -{ - constexpr explicit SynapseOnSynapseRow(uintmax_t const value = 0) - GENPYBIND(implicit_conversion) : - rant_t(value) - {} - - explicit SynapseOnSynapseRow( - EntryOnQuad const& syn_on_quad, SynapseQuadColumnOnDLS const& quad); - - EntryOnQuad toEntryOnQuad() const; - SynapseQuadColumnOnDLS toSynapseQuadColumnOnDLS() const; - NeuronColumnOnDLS toNeuronColumnOnDLS() const; - CADCChannelColumnOnSynram toCADCChannelColumnOnSynram() const; -}; - -struct GENPYBIND(inline_base("*")) SynapseOnSynram - : public common::detail:: - GridCoordinate<SynapseOnSynram, SynapseOnSynapseRow, SynapseRowOnSynram> -{ - GRID_COMMON_CONSTRUCTORS(SynapseOnSynram) - - SynapseOnSynapseRow toSynapseOnSynapseRow() const - { - return x(); - } - - SynapseRowOnSynram toSynapseRowOnSynram() const - { - return y(); - } -}; - -struct GENPYBIND(inline_base("*SynramMixin*")) SynapseOnDLS - : public SynramMixin<SynapseOnDLS, SynapseOnSynram> -{ - SynapseOnDLS() = default; - - explicit SynapseOnDLS( - SynapseOnSynram const& synapse, SynramOnDLS const& synram = SynramOnDLS()) : - mixin_t(synapse, synram) - {} - - explicit SynapseOnDLS(enum_type const& e) : mixin_t(e) {} - - SynapseOnSynram toSynapseOnSynram() const - { - return This(); - } -}; +using SynapseRowOnSynapseDriver GENPYBIND(visible) = + halco::hicann_dls::vx::SynapseRowOnSynapseDriver; +using SynapseRowOnSynram GENPYBIND(visible) = halco::hicann_dls::vx::SynapseRowOnSynram; +using SynapseRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseRowOnDLS; +using SynapseWeightRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseWeightRowOnDLS; +using SynapseLabelRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseLabelRowOnDLS; +using SynapseCorrelationCalibRowOnDLS GENPYBIND(visible) = + halco::hicann_dls::vx::SynapseCorrelationCalibRowOnDLS; +using CorrelationResetRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CorrelationResetRowOnDLS; +using ColumnCorrelationRowOnDLS GENPYBIND(visible) = + halco::hicann_dls::vx::ColumnCorrelationRowOnDLS; +using ColumnCurrentRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::ColumnCurrentRowOnDLS; +using SynapticInputOnNeuron GENPYBIND(visible) = halco::hicann_dls::vx::SynapticInputOnNeuron; +using SynapseBiasSelectionOnDLS GENPYBIND(visible) = + halco::hicann_dls::vx::SynapseBiasSelectionOnDLS; +using SynapseWeightMatrixOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseWeightMatrixOnDLS; +using SynapseLabelMatrixOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseLabelMatrixOnDLS; +using SynapseCorrelationCalibMatrixOnDLS GENPYBIND(visible) = + halco::hicann_dls::vx::SynapseCorrelationCalibMatrixOnDLS; +using SynapseBlockOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseBlockOnDLS; +using SynapseQuadColumnOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseQuadColumnOnDLS; +using SynapseQuadOnSynram GENPYBIND(visible) = halco::hicann_dls::vx::SynapseQuadOnSynram; +using SynapseOnSynapseRow GENPYBIND(visible) = halco::hicann_dls::vx::SynapseOnSynapseRow; +using SynapseOnSynram GENPYBIND(visible) = halco::hicann_dls::vx::SynapseOnSynram; +using SynapseOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseOnDLS; +using SynapseQuadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseQuadOnDLS; +using SynapseWeightQuadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseWeightQuadOnDLS; +using SynapseLabelQuadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseLabelQuadOnDLS; +using SynapseCorrelationCalibQuadOnDLS GENPYBIND(visible) = + halco::hicann_dls::vx::SynapseCorrelationCalibQuadOnDLS; +using CorrelationResetOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CorrelationResetOnDLS; } // namespace halco::hicann_dls::vx::v2 - -namespace std { - -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::SynapseQuadColumnOnDLS) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::SynapseQuadOnSynram) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::SynapseOnSynapseRow) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::SynapseOnSynram) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::SynapseOnDLS) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::SynapseQuadOnDLS) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::SynapseWeightQuadOnDLS) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::SynapseLabelQuadOnDLS) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::SynapseCorrelationCalibQuadOnDLS) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v2::CorrelationResetOnDLS) - -} // namespace std diff --git a/include/halco/hicann-dls/vx/v3/cadc.h b/include/halco/hicann-dls/vx/v3/cadc.h index f22fbcfa64cd394cff45f94bc2e58b5380a180c0..24a46c384de40ed8cf124d60866010fd73d6b209 100644 --- a/include/halco/hicann-dls/vx/v3/cadc.h +++ b/include/halco/hicann-dls/vx/v3/cadc.h @@ -1,20 +1,25 @@ #pragma once #include "halco/common/genpybind.h" #include "halco/hicann-dls/vx/cadc.h" -#include "halco/hicann-dls/vx/v3/synapse.h" namespace halco::hicann_dls::vx::v3 GENPYBIND_TAG_HALCO_HICANN_DLS_VX_V3 { -#include "halco/hicann-dls/vx/cadc_ns_includes.h" +using CADCOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCOnDLS; +using CADCConfigOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCConfigOnDLS; +using CADCChannelType GENPYBIND(visible) = halco::hicann_dls::vx::CADCChannelType; +using CADCReadoutType GENPYBIND(visible) = halco::hicann_dls::vx::CADCReadoutType; +using CADCChannelColumnOnSynram GENPYBIND(visible) = + halco::hicann_dls::vx::CADCChannelColumnOnSynram; +using CADCSampleRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCSampleRowOnDLS; +using CADCOffsetSRAMTimingConfigOnDLS GENPYBIND(visible) = + halco::hicann_dls::vx::CADCOffsetSRAMTimingConfigOnDLS; +using CADCSamplesOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCSamplesOnDLS; +using CADCSampleQuadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCSampleQuadOnDLS; +using CADCChannelConfigOnSynram GENPYBIND(visible) = + halco::hicann_dls::vx::CADCChannelConfigOnSynram; +using CADCChannelConfigOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CADCChannelConfigOnDLS; +using CADCSampleQuadUnspecifiedReadoutOnSynram GENPYBIND(visible) = + halco::hicann_dls::vx::CADCSampleQuadUnspecifiedReadoutOnSynram; +using CADCSampleQuadOnSynram GENPYBIND(visible) = halco::hicann_dls::vx::CADCSampleQuadOnSynram; } // namespace halco::hicann_dls::vx::v3 - -namespace std { - -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::CADCSampleQuadOnDLS) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::CADCChannelConfigOnSynram) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::CADCChannelConfigOnDLS) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::CADCSampleQuadUnspecifiedReadoutOnSynram) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::CADCSampleQuadOnSynram) - -} // namespace std diff --git a/include/halco/hicann-dls/vx/v3/neuron.h b/include/halco/hicann-dls/vx/v3/neuron.h index 4a841482907d34dac0ac32da92a218aa8d41e795..08aee054879b3f5148e52398ca9f0220772e6ff5 100644 --- a/include/halco/hicann-dls/vx/v3/neuron.h +++ b/include/halco/hicann-dls/vx/v3/neuron.h @@ -2,34 +2,56 @@ #include "halco/common/genpybind.h" #include "halco/common/iter_all.h" #include "halco/hicann-dls/vx/neuron.h" -#include "halco/hicann-dls/vx/v3/cadc.h" -#include "halco/hicann-dls/vx/v3/capmem.h" -#include "halco/hicann-dls/vx/v3/chip.h" -#include "halco/hicann-dls/vx/v3/correlation.h" -#include "halco/hicann-dls/vx/v3/padi.h" -#include "halco/hicann-dls/vx/v3/ppu.h" -#include "halco/hicann-dls/vx/v3/routing_crossbar.h" -#include "halco/hicann-dls/vx/v3/switch_rows.h" -#include "halco/hicann-dls/vx/v3/synapse.h" -#include "halco/hicann-dls/vx/v3/synapse_driver.h" -#include "halco/hicann-dls/vx/v3/synram.h" - -namespace cereal { -class access; -} // namespace cereal namespace halco::hicann_dls::vx::v3 GENPYBIND_TAG_HALCO_HICANN_DLS_VX_V3 { -#include "halco/hicann-dls/vx/neuron_ns_includes.h" +using NeuronRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronRowOnDLS; +using NeuronConfigOnNeuronConfigBlock GENPYBIND(visible) = + halco::hicann_dls::vx::NeuronConfigOnNeuronConfigBlock; +using NeuronConfigBlockOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronConfigBlockOnDLS; +using NeuronBackendConfigOnNeuronBackendConfigBlock GENPYBIND(visible) = + halco::hicann_dls::vx::NeuronBackendConfigOnNeuronBackendConfigBlock; +using NeuronBackendConfigBlockOnDLS GENPYBIND(visible) = + halco::hicann_dls::vx::NeuronBackendConfigBlockOnDLS; +using CommonNeuronBackendConfigOnDLS GENPYBIND(visible) = + halco::hicann_dls::vx::CommonNeuronBackendConfigOnDLS; +using NeuronResetOnNeuronResetBlock GENPYBIND(visible) = + halco::hicann_dls::vx::NeuronResetOnNeuronResetBlock; +using NeuronResetBlockOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronResetBlockOnDLS; +using NeuronResetOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronResetOnDLS; +using BlockPostPulseOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::BlockPostPulseOnDLS; +using SpikeCounterReadOnSpikeCounterReadBlock GENPYBIND(visible) = + halco::hicann_dls::vx::SpikeCounterReadOnSpikeCounterReadBlock; +using SpikeCounterReadBlockOnDLS GENPYBIND(visible) = + halco::hicann_dls::vx::SpikeCounterReadBlockOnDLS; +using SpikeCounterReadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SpikeCounterReadOnDLS; +using SpikeCounterResetOnSpikeCounterResetBlock GENPYBIND(visible) = + halco::hicann_dls::vx::SpikeCounterResetOnSpikeCounterResetBlock; +using SpikeCounterResetBlockOnDLS GENPYBIND(visible) = + halco::hicann_dls::vx::SpikeCounterResetBlockOnDLS; +using SpikeCounterResetOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SpikeCounterResetOnDLS; +using NeuronEventOutputOnNeuronBackendBlock GENPYBIND(visible) = + halco::hicann_dls::vx::NeuronEventOutputOnNeuronBackendBlock; +using NeuronEventOutputOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronEventOutputOnDLS; +using NeuronSRAMTimingConfigOnDLS GENPYBIND(visible) = + halco::hicann_dls::vx::NeuronSRAMTimingConfigOnDLS; +using NeuronBackendSRAMTimingConfigOnDLS GENPYBIND(visible) = + halco::hicann_dls::vx::NeuronBackendSRAMTimingConfigOnDLS; +using NeuronRowOnLogicalNeuron = halco::hicann_dls::vx::NeuronRowOnLogicalNeuron; +using NeuronBlockOnDLS = halco::hicann_dls::vx::NeuronBlockOnDLS; +using NeuronColumnOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronColumnOnDLS; +using AtomicNeuronOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::AtomicNeuronOnDLS; +using NeuronConfigOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronConfigOnDLS; +using NeuronBackendConfigOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronBackendConfigOnDLS; +using NeuronResetQuadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::NeuronResetQuadOnDLS; +using LogicalNeuronOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::LogicalNeuronOnDLS; +using LogicalNeuronCompartments GENPYBIND(visible) = + halco::hicann_dls::vx::LogicalNeuronCompartments; +using AtomicNeuronOnLogicalNeuron GENPYBIND(visible) = + halco::hicann_dls::vx::AtomicNeuronOnLogicalNeuron; +using NeuronColumnOnLogicalNeuron GENPYBIND(visible) = + halco::hicann_dls::vx::NeuronColumnOnLogicalNeuron; +using CompartmentOnLogicalNeuron GENPYBIND(visible) = + halco::hicann_dls::vx::CompartmentOnLogicalNeuron; } // namespace halco::hicann_dls::vx::v3 - -namespace std { - -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::NeuronColumnOnDLS) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::AtomicNeuronOnDLS) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::NeuronConfigOnDLS) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::NeuronBackendConfigOnDLS) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::NeuronResetQuadOnDLS) - -} // namespace std diff --git a/include/halco/hicann-dls/vx/v3/switch_rows.h b/include/halco/hicann-dls/vx/v3/switch_rows.h index f97feab5dedb9676da45b14de164d78ecde49d9e..8ebfc50269d4517e83570eb511ef2944c0c9dce8 100644 --- a/include/halco/hicann-dls/vx/v3/switch_rows.h +++ b/include/halco/hicann-dls/vx/v3/switch_rows.h @@ -1,19 +1,15 @@ #pragma once #include "halco/common/genpybind.h" -#include "halco/hicann-dls/vx/v3/synapse.h" -#include "halco/hicann-dls/vx/v3/synram.h" +#include "halco/hicann-dls/vx/switch_rows.h" namespace halco::hicann_dls::vx::v3 GENPYBIND_TAG_HALCO_HICANN_DLS_VX_V3 { -#include "halco/hicann-dls/vx/switch_rows_ns_includes.h" +using ColumnCorrelationQuadOnSynram GENPYBIND(visible) = + halco::hicann_dls::vx::ColumnCorrelationQuadOnSynram; +using ColumnCurrentQuadOnSynram GENPYBIND(visible) = + halco::hicann_dls::vx::ColumnCurrentQuadOnSynram; +using ColumnCorrelationQuadOnDLS GENPYBIND(visible) = + halco::hicann_dls::vx::ColumnCorrelationQuadOnDLS; +using ColumnCurrentQuadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::ColumnCurrentQuadOnDLS; } // namespace halco::hicann_dls::vx::v3 - -namespace std { - -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::ColumnCorrelationQuadOnSynram) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::ColumnCurrentQuadOnSynram) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::ColumnCorrelationQuadOnDLS) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::ColumnCurrentQuadOnDLS) - -} // namespace std diff --git a/include/halco/hicann-dls/vx/v3/synapse.h b/include/halco/hicann-dls/vx/v3/synapse.h index 634998dc3c61398b6996fac0b7ffabba5dab7fc7..51b86ed84afe85a92fc503b338f9ef22343c0a64 100644 --- a/include/halco/hicann-dls/vx/v3/synapse.h +++ b/include/halco/hicann-dls/vx/v3/synapse.h @@ -2,79 +2,39 @@ #include "halco/common/genpybind.h" #include "halco/hicann-dls/vx/cadc.h" #include "halco/hicann-dls/vx/synapse.h" -#include "halco/hicann-dls/vx/v3/quad.h" -#include "halco/hicann-dls/vx/v3/synram.h" namespace halco::hicann_dls::vx::v3 GENPYBIND_TAG_HALCO_HICANN_DLS_VX_V3 { -#include "halco/hicann-dls/vx/synapse_ns_includes.h" - -struct GENPYBIND(inline_base("*")) SynapseOnSynapseRow - : public common::detail::RantWrapper<SynapseOnSynapseRow, uint_fast16_t, 255, 0> - , public common::detail::XRangedTrait -{ - constexpr explicit SynapseOnSynapseRow(uintmax_t const value = 0) - GENPYBIND(implicit_conversion) : - rant_t(value) - {} - - explicit SynapseOnSynapseRow( - EntryOnQuad const& syn_on_quad, SynapseQuadColumnOnDLS const& quad); - - EntryOnQuad toEntryOnQuad() const; - SynapseQuadColumnOnDLS toSynapseQuadColumnOnDLS() const; - NeuronColumnOnDLS toNeuronColumnOnDLS() const; - CADCChannelColumnOnSynram toCADCChannelColumnOnSynram() const; -}; - -struct GENPYBIND(inline_base("*")) SynapseOnSynram - : public common::detail:: - GridCoordinate<SynapseOnSynram, SynapseOnSynapseRow, SynapseRowOnSynram> -{ - GRID_COMMON_CONSTRUCTORS(SynapseOnSynram) - - SynapseOnSynapseRow toSynapseOnSynapseRow() const - { - return x(); - } - - SynapseRowOnSynram toSynapseRowOnSynram() const - { - return y(); - } -}; - -struct GENPYBIND(inline_base("*SynramMixin*")) SynapseOnDLS - : public SynramMixin<SynapseOnDLS, SynapseOnSynram> -{ - SynapseOnDLS() = default; - - explicit SynapseOnDLS( - SynapseOnSynram const& synapse, SynramOnDLS const& synram = SynramOnDLS()) : - mixin_t(synapse, synram) - {} - - explicit SynapseOnDLS(enum_type const& e) : mixin_t(e) {} - - SynapseOnSynram toSynapseOnSynram() const - { - return This(); - } -}; +using SynapseRowOnSynapseDriver GENPYBIND(visible) = + halco::hicann_dls::vx::SynapseRowOnSynapseDriver; +using SynapseRowOnSynram GENPYBIND(visible) = halco::hicann_dls::vx::SynapseRowOnSynram; +using SynapseRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseRowOnDLS; +using SynapseWeightRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseWeightRowOnDLS; +using SynapseLabelRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseLabelRowOnDLS; +using SynapseCorrelationCalibRowOnDLS GENPYBIND(visible) = + halco::hicann_dls::vx::SynapseCorrelationCalibRowOnDLS; +using CorrelationResetRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CorrelationResetRowOnDLS; +using ColumnCorrelationRowOnDLS GENPYBIND(visible) = + halco::hicann_dls::vx::ColumnCorrelationRowOnDLS; +using ColumnCurrentRowOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::ColumnCurrentRowOnDLS; +using SynapticInputOnNeuron GENPYBIND(visible) = halco::hicann_dls::vx::SynapticInputOnNeuron; +using SynapseBiasSelectionOnDLS GENPYBIND(visible) = + halco::hicann_dls::vx::SynapseBiasSelectionOnDLS; +using SynapseWeightMatrixOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseWeightMatrixOnDLS; +using SynapseLabelMatrixOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseLabelMatrixOnDLS; +using SynapseCorrelationCalibMatrixOnDLS GENPYBIND(visible) = + halco::hicann_dls::vx::SynapseCorrelationCalibMatrixOnDLS; +using SynapseBlockOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseBlockOnDLS; +using SynapseQuadColumnOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseQuadColumnOnDLS; +using SynapseQuadOnSynram GENPYBIND(visible) = halco::hicann_dls::vx::SynapseQuadOnSynram; +using SynapseOnSynapseRow GENPYBIND(visible) = halco::hicann_dls::vx::SynapseOnSynapseRow; +using SynapseOnSynram GENPYBIND(visible) = halco::hicann_dls::vx::SynapseOnSynram; +using SynapseOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseOnDLS; +using SynapseQuadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseQuadOnDLS; +using SynapseWeightQuadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseWeightQuadOnDLS; +using SynapseLabelQuadOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::SynapseLabelQuadOnDLS; +using SynapseCorrelationCalibQuadOnDLS GENPYBIND(visible) = + halco::hicann_dls::vx::SynapseCorrelationCalibQuadOnDLS; +using CorrelationResetOnDLS GENPYBIND(visible) = halco::hicann_dls::vx::CorrelationResetOnDLS; } // namespace halco::hicann_dls::vx::v3 - -namespace std { - -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::SynapseQuadColumnOnDLS) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::SynapseQuadOnSynram) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::SynapseOnSynapseRow) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::SynapseOnSynram) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::SynapseOnDLS) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::SynapseQuadOnDLS) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::SynapseWeightQuadOnDLS) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::SynapseLabelQuadOnDLS) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::SynapseCorrelationCalibQuadOnDLS) -HALCO_GEOMETRY_HASH_CLASS(halco::hicann_dls::vx::v3::CorrelationResetOnDLS) - -} // namespace std diff --git a/src/halco/hicann-dls/vx/cadc.cpp b/src/halco/hicann-dls/vx/cadc.cpp index a75b9acb28abd28a8642eabdf1494006df644766..d8d41d58cc1e41b03119577ce6d125ccbe4a1c3e 100644 --- a/src/halco/hicann-dls/vx/cadc.cpp +++ b/src/halco/hicann-dls/vx/cadc.cpp @@ -42,4 +42,36 @@ SynapseCorrelationCalibRowOnDLS CADCSampleRowOnDLS::toSynapseCorrelationCalibRow return SynapseCorrelationCalibRowOnDLS(toEnum()); } +SynapseQuadOnDLS CADCSampleQuadOnDLS::toSynapseQuadOnDLS() const +{ + return SynapseQuadOnDLS( + toCADCSampleQuadOnSynram() + .toCADCSampleQuadUnspecifiedReadoutOnSynram() + .toSynapseQuadOnSynram(), + toSynramOnDLS()); +} + +SynapseWeightQuadOnDLS CADCSampleQuadOnDLS::toSynapseWeightQuadOnDLS() const +{ + return toSynapseQuadOnDLS().toSynapseWeightQuadOnDLS(); +} + +SynapseLabelQuadOnDLS CADCSampleQuadOnDLS::toSynapseLabelQuadOnDLS() const +{ + return toSynapseQuadOnDLS().toSynapseLabelQuadOnDLS(); +} + +SynapseCorrelationCalibQuadOnDLS CADCSampleQuadOnDLS::toSynapseCorrelationCalibQuadOnDLS() const +{ + return toSynapseQuadOnDLS().toSynapseCorrelationCalibQuadOnDLS(); +} + + +NeuronConfigBlockOnDLS CADCChannelConfigOnDLS::toNeuronConfigBlockOnDLS() const +{ + return NeuronConfigBlockOnDLS( + (2 * toSynramOnDLS().toEnum()) + + (toSynapseOnSynapseRow() / NeuronConfigOnNeuronConfigBlock::size)); +} + } // namespace halco::hicann_dls::vx diff --git a/src/halco/hicann-dls/vx/neuron.cpp b/src/halco/hicann-dls/vx/neuron.cpp index 468573477e8bce1b926c568a8ecf9670dae5e881..bd88405fbb39aa796cff7102caa4979fb00ed10b 100644 --- a/src/halco/hicann-dls/vx/neuron.cpp +++ b/src/halco/hicann-dls/vx/neuron.cpp @@ -4,8 +4,18 @@ #include "halco/hicann-dls/vx/capmem.h" #include "halco/hicann-dls/vx/hemisphere.h" #include "halco/hicann-dls/vx/routing_crossbar.h" +#include "halco/hicann-dls/vx/switch_rows.h" #include "halco/hicann-dls/vx/synapse.h" +#ifndef __ppu__ +#include "halco/common/cerealization_geometry.h" +#include <cereal/archives/json.hpp> +#include <cereal/archives/portable_binary.hpp> +#include <cereal/cereal.hpp> +#include <cereal/types/map.hpp> +#include <cereal/types/vector.hpp> +#endif + namespace halco::hicann_dls::vx { #define HEMISPHERE_CLASS NeuronRowOnDLS @@ -74,4 +84,534 @@ CrossbarInputOnDLS NeuronEventOutputOnDLS::toCrossbarInputOnDLS() const return CrossbarInputOnDLS(toEnum()); } +NeuronResetOnDLS NeuronConfigOnDLS::toNeuronResetOnDLS() const +{ + auto block = toNeuronConfigBlockOnDLS().toNeuronResetBlockOnDLS(); + return NeuronResetOnDLS( + NeuronResetOnNeuronResetBlock( + toNeuronConfigOnNeuronConfigBlock() + + ((toNeuronConfigBlockOnDLS() / NeuronResetBlockOnDLS::size) + ? NeuronConfigOnNeuronConfigBlock::size + : 0)), + block); +} + +SpikeCounterReadOnDLS NeuronConfigOnDLS::toSpikeCounterReadOnDLS() const +{ + return SpikeCounterReadOnDLS(toNeuronResetOnDLS().toEnum()); +} + +SpikeCounterResetOnDLS NeuronConfigOnDLS::toSpikeCounterResetOnDLS() const +{ + return SpikeCounterResetOnDLS(toNeuronResetOnDLS().toEnum()); +} + +SynapseOnSynapseRow NeuronColumnOnDLS::toSynapseOnSynapseRow() const +{ + return SynapseOnSynapseRow(toEnum()); +} + +CapMemColumnOnCapMemBlock NeuronColumnOnDLS::toCapMemColumnOnCapMemBlock() const +{ + return CapMemColumnOnCapMemBlock(toEnum() % NeuronConfigOnNeuronConfigBlock::size); +} + +NeuronEventOutputOnDLS NeuronColumnOnDLS::toNeuronEventOutputOnDLS() const +{ + return NeuronEventOutputOnDLS(common::Enum(toEnum() / (size / NeuronEventOutputOnDLS::size))); +} + +NeuronConfigOnDLS AtomicNeuronOnDLS::toNeuronConfigOnDLS() const +{ + return NeuronConfigOnDLS(toEnum()); +} + +NeuronResetOnDLS AtomicNeuronOnDLS::toNeuronResetOnDLS() const +{ + return toNeuronConfigOnDLS().toNeuronResetOnDLS(); +} + +SpikeCounterReadOnDLS AtomicNeuronOnDLS::toSpikeCounterReadOnDLS() const +{ + return toNeuronConfigOnDLS().toSpikeCounterReadOnDLS(); +} + +SpikeCounterResetOnDLS AtomicNeuronOnDLS::toSpikeCounterResetOnDLS() const +{ + return toNeuronConfigOnDLS().toSpikeCounterResetOnDLS(); +} + +NeuronBackendConfigOnDLS AtomicNeuronOnDLS::toNeuronBackendConfigOnDLS() const +{ + return NeuronBackendConfigOnDLS(toNeuronResetOnDLS().toEnum()); +} + +CapMemColumnOnCapMemBlock AtomicNeuronOnDLS::toCapMemColumnOnCapMemBlock() const +{ + return toNeuronColumnOnDLS().toCapMemColumnOnCapMemBlock(); +} + +CapMemBlockOnDLS AtomicNeuronOnDLS::toCapMemBlockOnDLS() const +{ + return toNeuronConfigOnDLS().toNeuronConfigBlockOnDLS().toCapMemBlockOnDLS(); +} + +NeuronRowOnDLS NeuronConfigOnDLS::toNeuronRowOnDLS() const +{ + return NeuronRowOnDLS(toEnum() / SynapseOnSynapseRow::size); +} + +SynapseOnSynapseRow NeuronConfigOnDLS::toSynapseOnSynapseRow() const +{ + return SynapseOnSynapseRow(toEnum() % SynapseOnSynapseRow::size); +} + +AtomicNeuronOnDLS NeuronConfigOnDLS::toAtomicNeuronOnDLS() const +{ + return AtomicNeuronOnDLS(toSynapseOnSynapseRow().toNeuronColumnOnDLS(), toNeuronRowOnDLS()); +} + +SynapseQuadColumnOnDLS NeuronConfigOnDLS::toSynapseQuadColumnOnDLS() const +{ + return toSynapseOnSynapseRow().toSynapseQuadColumnOnDLS(); +} + +EntryOnQuad NeuronConfigOnDLS::toEntryOnQuad() const +{ + return toSynapseOnSynapseRow().toEntryOnQuad(); +} + +NeuronBackendConfigBlockOnDLS NeuronConfigOnDLS::toNeuronBackendConfigBlockOnDLS() const +{ + return toAtomicNeuronOnDLS().toNeuronBackendConfigOnDLS().toNeuronBackendConfigBlockOnDLS(); +} + +NeuronBackendConfigOnNeuronBackendConfigBlock +NeuronConfigOnDLS::toNeuronBackendConfigOnNeuronBackendConfigBlock() const +{ + return toAtomicNeuronOnDLS() + .toNeuronBackendConfigOnDLS() + .toNeuronBackendConfigOnNeuronBackendConfigBlock(); +} + +NeuronBackendConfigOnDLS NeuronConfigOnDLS::toNeuronBackendConfigOnDLS() const +{ + return toAtomicNeuronOnDLS().toNeuronBackendConfigOnDLS(); +} + +CommonNeuronBackendConfigOnDLS NeuronConfigOnDLS::toCommonNeuronBackendConfigOnDLS() const +{ + return toNeuronBackendConfigBlockOnDLS().toCommonNeuronBackendConfigOnDLS(); +} + +NeuronColumnOnDLS NeuronBackendConfigOnDLS::toNeuronColumnOnDLS() const +{ + return NeuronColumnOnDLS( + (toNeuronBackendConfigOnNeuronBackendConfigBlock() % + NeuronConfigOnNeuronConfigBlock::size) + + (toNeuronBackendConfigBlockOnDLS() * NeuronConfigOnNeuronConfigBlock::size)); +} + +NeuronRowOnDLS NeuronBackendConfigOnDLS::toNeuronRowOnDLS() const +{ + return NeuronRowOnDLS( + toNeuronBackendConfigOnNeuronBackendConfigBlock() / NeuronConfigOnNeuronConfigBlock::size); +} + +AtomicNeuronOnDLS NeuronBackendConfigOnDLS::toAtomicNeuronOnDLS() const +{ + return AtomicNeuronOnDLS(toNeuronColumnOnDLS(), toNeuronRowOnDLS()); +} + +NeuronConfigOnDLS NeuronBackendConfigOnDLS::toNeuronConfigOnDLS() const +{ + return toAtomicNeuronOnDLS().toNeuronConfigOnDLS(); +} + +SpikeCounterReadOnDLS NeuronBackendConfigOnDLS::toSpikeCounterReadOnDLS() const +{ + return toNeuronConfigOnDLS().toSpikeCounterReadOnDLS(); +} + +SpikeCounterResetOnDLS NeuronBackendConfigOnDLS::toSpikeCounterResetOnDLS() const +{ + return toNeuronConfigOnDLS().toSpikeCounterResetOnDLS(); +} + +CommonNeuronBackendConfigOnDLS NeuronBackendConfigOnDLS::toCommonNeuronBackendConfigOnDLS() const +{ + return toNeuronBackendConfigBlockOnDLS().toCommonNeuronBackendConfigOnDLS(); +} + +SynramOnDLS AtomicNeuronOnDLS::toSynramOnDLS() const +{ + return toNeuronRowOnDLS().toSynramOnDLS(); +} + +SynramOnDLS NeuronConfigOnDLS::toSynramOnDLS() const +{ + return toAtomicNeuronOnDLS().toSynramOnDLS(); +} + +SynramOnDLS NeuronBackendConfigOnDLS::toSynramOnDLS() const +{ + return toAtomicNeuronOnDLS().toSynramOnDLS(); +} + +NeuronConfigBlockOnDLS NeuronBackendConfigOnDLS::toNeuronConfigBlockOnDLS() const +{ + return toNeuronConfigOnDLS().toNeuronConfigBlockOnDLS(); +} + +SynapseQuadColumnOnDLS AtomicNeuronOnDLS::toSynapseQuadColumnOnDLS() const +{ + return toNeuronConfigOnDLS().toSynapseQuadColumnOnDLS(); +} + +ColumnCorrelationQuadOnDLS AtomicNeuronOnDLS::toColumnCorrelationQuadOnDLS() const +{ + return ColumnCorrelationQuadOnDLS( + toSynapseQuadColumnOnDLS().toColumnCorrelationQuadOnSynram(), toSynramOnDLS()); +} + +ColumnCurrentQuadOnDLS AtomicNeuronOnDLS::toColumnCurrentQuadOnDLS() const +{ + return ColumnCurrentQuadOnDLS( + toSynapseQuadColumnOnDLS().toColumnCurrentQuadOnSynram(), toSynramOnDLS()); +} + +ColumnCorrelationQuadOnDLS NeuronConfigOnDLS::toColumnCorrelationQuadOnDLS() const +{ + return toAtomicNeuronOnDLS().toColumnCorrelationQuadOnDLS(); +} + +ColumnCurrentQuadOnDLS NeuronConfigOnDLS::toColumnCurrentQuadOnDLS() const +{ + return toAtomicNeuronOnDLS().toColumnCurrentQuadOnDLS(); +} + +common::typed_array<NeuronResetOnDLS, EntryOnQuad> NeuronResetQuadOnDLS::toNeuronResetOnDLS() const +{ + common::typed_array<NeuronResetOnDLS, EntryOnQuad> ret; + auto const columns = toSynapseQuadColumnOnDLS().toNeuronColumnOnDLS(); + for (auto const e : common::iter_all<EntryOnQuad>()) { + ret[e] = + AtomicNeuronOnDLS(columns[e], toSynramOnDLS().toNeuronRowOnDLS()).toNeuronResetOnDLS(); + } + return ret; +} + +AtomicNeuronOnLogicalNeuron AtomicNeuronOnLogicalNeuron::get_neighbor( + Direction const& direction) const +{ + switch (direction) { + case Direction::left: { + AtomicNeuronOnLogicalNeuron neighbor(NeuronColumnOnLogicalNeuron(x().value() - 1), y()); + return neighbor; + } + case Direction::right: { + AtomicNeuronOnLogicalNeuron neighbor(NeuronColumnOnLogicalNeuron(x().value() + 1), y()); + return neighbor; + } + case Direction::opposite_row: { + AtomicNeuronOnLogicalNeuron neighbor( + x(), NeuronRowOnLogicalNeuron((y().value() + 1) % NeuronRowOnLogicalNeuron::size)); + return neighbor; + } + default: { +#ifndef __ppu__ + throw std::logic_error( + "Unsupported direction for neighbor for AtomicNeuronOnLogicalNeuron was chosen."); +#else + exit(1); +#endif + } + } +} + +LogicalNeuronCompartments::LogicalNeuronCompartments(Compartments const& compartments) +{ + std::set<AtomicNeuronOnLogicalNeuron> unique; + size_t n = 0; + for (auto const& [_, compartment] : compartments) { + unique.insert(compartment.begin(), compartment.end()); + n += compartment.size(); + } + if (unique.size() != n) { +#ifndef __ppu__ + throw std::runtime_error("Multiple compartments contain the same neuron(s)."); +#else + exit(1); +#endif + } + m_compartments = compartments; +} + +LogicalNeuronCompartments::Compartments const& LogicalNeuronCompartments::get_compartments() const +{ + return m_compartments; +} + +NeuronColumnOnLogicalNeuron LogicalNeuronCompartments::get_left_most_column() const +{ + NeuronColumnOnLogicalNeuron lmost(NeuronColumnOnLogicalNeuron::max); + for (auto const& [_, compartment] : m_compartments) { + auto const lm = + std::min_element( + compartment.begin(), compartment.end(), + [](auto const& a, auto const& b) { + return a.toNeuronColumnOnLogicalNeuron() < b.toNeuronColumnOnLogicalNeuron(); + }) + ->toNeuronColumnOnLogicalNeuron(); + lmost = std::min(lm, lmost); + } + return lmost; +} + +NeuronColumnOnLogicalNeuron LogicalNeuronCompartments::get_right_most_column() const +{ + NeuronColumnOnLogicalNeuron rmost(NeuronColumnOnLogicalNeuron::min); + for (auto const& [_, compartment] : m_compartments) { + auto const rm = + std::max_element( + compartment.begin(), compartment.end(), + [](auto const& a, auto const& b) { + return a.toNeuronColumnOnLogicalNeuron() < b.toNeuronColumnOnLogicalNeuron(); + }) + ->toNeuronColumnOnLogicalNeuron(); + rmost = std::max(rm, rmost); + } + return rmost; +} + +NeuronRowOnLogicalNeuron LogicalNeuronCompartments::get_top_most_row() const +{ + NeuronRowOnLogicalNeuron tmost(NeuronRowOnLogicalNeuron::max); + for (auto const& [_, compartment] : m_compartments) { + auto const tm = + std::min_element( + compartment.begin(), compartment.end(), + [](auto const& a, auto const& b) { + return a.toNeuronRowOnLogicalNeuron() < b.toNeuronRowOnLogicalNeuron(); + }) + ->toNeuronRowOnLogicalNeuron(); + tmost = std::min(tm, tmost); + } + return tmost; +} + +NeuronRowOnLogicalNeuron LogicalNeuronCompartments::get_bottom_most_row() const +{ + NeuronRowOnLogicalNeuron bmost(NeuronRowOnLogicalNeuron::min); + for (auto const& [_, compartment] : m_compartments) { + auto const bm = + std::max_element( + compartment.begin(), compartment.end(), + [](auto const& a, auto const& b) { + return a.toNeuronRowOnLogicalNeuron() < b.toNeuronRowOnLogicalNeuron(); + }) + ->toNeuronRowOnLogicalNeuron(); + bmost = std::max(bm, bmost); + } + return bmost; +} + +LogicalNeuronCompartments LogicalNeuronCompartments::flip_x() const +{ + Compartments flipped_compartments; + auto const lmost = get_left_most_column(); + auto const rmost = get_right_most_column(); + for (auto const& [index, compartment] : m_compartments) { + Compartment& flipped_compartment = flipped_compartments[index]; + for (auto const& neuron : compartment) { + flipped_compartment.push_back(AtomicNeuronOnLogicalNeuron( + NeuronColumnOnLogicalNeuron( + lmost.value() + rmost.value() - neuron.toNeuronColumnOnLogicalNeuron().value()), + neuron.toNeuronRowOnLogicalNeuron())); + } + } + return LogicalNeuronCompartments(flipped_compartments); +} + +LogicalNeuronCompartments LogicalNeuronCompartments::flip_y() const +{ + Compartments flipped_compartments; + auto const tmost = get_top_most_row(); + auto const bmost = get_bottom_most_row(); + for (auto const& [index, compartment] : m_compartments) { + Compartment& flipped_compartment = flipped_compartments[index]; + for (auto const& neuron : compartment) { + flipped_compartment.push_back(AtomicNeuronOnLogicalNeuron( + neuron.toNeuronColumnOnLogicalNeuron(), + NeuronRowOnLogicalNeuron( + tmost.value() + bmost.value() - neuron.toNeuronRowOnLogicalNeuron().value()))); + } + } + return LogicalNeuronCompartments(flipped_compartments); +} + +bool LogicalNeuronCompartments::operator==(LogicalNeuronCompartments const& other) const +{ + return m_compartments == other.m_compartments; +} + +bool LogicalNeuronCompartments::operator!=(LogicalNeuronCompartments const& other) const +{ + return !(*this == other); +} + +bool LogicalNeuronCompartments::operator<(LogicalNeuronCompartments const& other) const +{ + return m_compartments < other.m_compartments; +} + +bool LogicalNeuronCompartments::operator>(LogicalNeuronCompartments const& other) const +{ + return m_compartments > other.m_compartments; +} + +bool LogicalNeuronCompartments::operator<=(LogicalNeuronCompartments const& other) const +{ + return m_compartments <= other.m_compartments; +} + +bool LogicalNeuronCompartments::operator>=(LogicalNeuronCompartments const& other) const +{ + return m_compartments >= other.m_compartments; +} + +#ifndef __ppu__ +std::ostream& operator<<(std::ostream& os, LogicalNeuronCompartments const& config) +{ + os << "LogicalNeuronCompartments(\n"; + for (auto const& [index, compartment] : config.m_compartments) { + os << index << "\n"; + for (auto const& neuron : compartment) { + os << "\t" << neuron << "\n"; + } + } + os << ")"; + return os; +} + +template <typename Archive> +void LogicalNeuronCompartments::serialize(Archive& ar, uint32_t const) +{ + ar(m_compartments); +} +#endif + +LogicalNeuronOnDLS::LogicalNeuronOnDLS( + LogicalNeuronCompartments const& compartments, AtomicNeuronOnDLS const& anchor) +{ + auto const lmost = compartments.get_left_most_column(); + auto const rmost = compartments.get_right_most_column(); + auto const bmost = compartments.get_bottom_most_row(); + auto const tmost = compartments.get_top_most_row(); + auto const height = bmost.value() - tmost.value(); + auto const width = rmost.value() - lmost.value(); + + if ((anchor.toNeuronRowOnDLS().value() + height) > NeuronRowOnDLS::max) { +#ifndef __ppu__ + throw std::runtime_error( + "LogicalNeuron anchor results in placement of compartments outside of neuron grid."); +#else + exit(1); +#endif + } + if ((((anchor.toNeuronColumnOnDLS().value()) < NeuronColumnOnLogicalNeuron::max) && + ((anchor.toNeuronColumnOnDLS().value() + width) > NeuronColumnOnLogicalNeuron::max)) || + (((anchor.toNeuronColumnOnDLS().value()) > NeuronColumnOnLogicalNeuron::max) && + ((anchor.toNeuronColumnOnDLS().value() + width) > NeuronColumnOnDLS::max))) { +#ifndef __ppu__ + throw std::runtime_error( + "LogicalNeuron anchor results in placement of compartments outside of neuron grid."); +#else + exit(1); +#endif + } + for (auto const& [index, compartment] : compartments.get_compartments()) { + auto& placed_compartment = m_compartments[index]; + for (auto const& neuron : compartment) { + placed_compartment.push_back(AtomicNeuronOnDLS( + NeuronColumnOnDLS( + anchor.toNeuronColumnOnDLS().value() + + neuron.toNeuronColumnOnLogicalNeuron().value() - lmost.value()), + NeuronRowOnDLS( + anchor.toNeuronRowOnDLS().value() + + neuron.toNeuronRowOnLogicalNeuron().value() - tmost.value()))); + } + } +} + +LogicalNeuronOnDLS::PlacedCompartments LogicalNeuronOnDLS::get_placed_compartments() const +{ + return m_compartments; +} + +bool LogicalNeuronOnDLS::operator==(LogicalNeuronOnDLS const& other) const +{ + return (m_compartments == other.m_compartments); +} + +bool LogicalNeuronOnDLS::operator!=(LogicalNeuronOnDLS const& other) const +{ + return !(*this == other); +} + +bool LogicalNeuronOnDLS::operator<(LogicalNeuronOnDLS const& other) const +{ + return m_compartments < other.m_compartments; +} + +bool LogicalNeuronOnDLS::operator>(LogicalNeuronOnDLS const& other) const +{ + return m_compartments > other.m_compartments; +} + +bool LogicalNeuronOnDLS::operator<=(LogicalNeuronOnDLS const& other) const +{ + return m_compartments <= other.m_compartments; +} + +bool LogicalNeuronOnDLS::operator>=(LogicalNeuronOnDLS const& other) const +{ + return m_compartments >= other.m_compartments; +} + +#ifndef __ppu__ +std::ostream& operator<<(std::ostream& os, LogicalNeuronOnDLS const& config) +{ + os << "LogicalNeuronOnDLS(\n"; + for (auto const& [index, compartment] : config.m_compartments) { + os << index << "\n"; + for (auto const& neuron : compartment) { + os << "\t" << neuron << "\n"; + } + } + os << ")"; + return os; +} + +template <typename Archive> +void LogicalNeuronOnDLS::serialize(Archive& ar, uint32_t const) +{ + ar(m_compartments); +} +#endif + +#ifndef __ppu__ +#define EXPLICIT_INSTANTIATE_CEREAL_SERIALIZE(CLASS_NAME) \ + template void CLASS_NAME ::CEREAL_SERIALIZE_FUNCTION_NAME( \ + cereal::JSONOutputArchive&, std::uint32_t const); \ + template void CLASS_NAME ::CEREAL_SERIALIZE_FUNCTION_NAME( \ + cereal::JSONInputArchive&, std::uint32_t const); \ + template void CLASS_NAME ::CEREAL_SERIALIZE_FUNCTION_NAME( \ + cereal::PortableBinaryOutputArchive&, std::uint32_t const); \ + template void CLASS_NAME ::CEREAL_SERIALIZE_FUNCTION_NAME( \ + cereal::PortableBinaryInputArchive&, std::uint32_t const); + +EXPLICIT_INSTANTIATE_CEREAL_SERIALIZE(LogicalNeuronCompartments) +EXPLICIT_INSTANTIATE_CEREAL_SERIALIZE(LogicalNeuronOnDLS) +#endif } // namespace halco::hicann_dls::vx diff --git a/src/halco/hicann-dls/vx/synapse.cpp b/src/halco/hicann-dls/vx/synapse.cpp index 9ce7691bafe9d61f0c1f59bd7b1a708bb29dc5d9..5a5bc83c91b141cab85e444a636640c77f3d4b38 100644 --- a/src/halco/hicann-dls/vx/synapse.cpp +++ b/src/halco/hicann-dls/vx/synapse.cpp @@ -5,6 +5,7 @@ #include "halco/hicann-dls/vx/neuron.h" #include "halco/hicann-dls/vx/padi.h" #include "halco/hicann-dls/vx/ppu.h" +#include "halco/hicann-dls/vx/switch_rows.h" #include "halco/hicann-dls/vx/synapse_driver.h" @@ -124,4 +125,138 @@ SynapseCorrelationCalibMatrixOnDLS const SynapseCorrelationCalibMatrixOnDLS::bot SynapseBlockOnDLS const SynapseBlockOnDLS::top{enum_vertical_top}; SynapseBlockOnDLS const SynapseBlockOnDLS::bottom{enum_vertical_bottom}; +ColumnCorrelationQuadOnSynram SynapseQuadColumnOnDLS::toColumnCorrelationQuadOnSynram() const +{ + return ColumnCorrelationQuadOnSynram(toEnum()); +} + +ColumnCurrentQuadOnSynram SynapseQuadColumnOnDLS::toColumnCurrentQuadOnSynram() const +{ + return ColumnCurrentQuadOnSynram(toEnum()); +} + +SynapseWeightQuadOnDLS SynapseQuadOnDLS::toSynapseWeightQuadOnDLS() const +{ + return SynapseWeightQuadOnDLS(toEnum()); +} + +SynapseLabelQuadOnDLS SynapseQuadOnDLS::toSynapseLabelQuadOnDLS() const +{ + return SynapseLabelQuadOnDLS(toEnum()); +} + +SynapseCorrelationCalibQuadOnDLS SynapseQuadOnDLS::toSynapseCorrelationCalibQuadOnDLS() const +{ + return SynapseCorrelationCalibQuadOnDLS(toEnum()); +} + +NeuronConfigBlockOnDLS SynapseWeightQuadOnDLS::toNeuronConfigBlockOnDLS() const +{ + return toSynapseQuadOnDLS().toNeuronConfigBlockOnDLS(); +} + +SynapseQuadOnDLS SynapseWeightQuadOnDLS::toSynapseQuadOnDLS() const +{ + return SynapseQuadOnDLS(toEnum()); +} + +SynapseLabelQuadOnDLS SynapseWeightQuadOnDLS::toSynapseLabelQuadOnDLS() const +{ + return SynapseLabelQuadOnDLS(toEnum()); +} + +SynapseCorrelationCalibQuadOnDLS SynapseWeightQuadOnDLS::toSynapseCorrelationCalibQuadOnDLS() const +{ + return SynapseCorrelationCalibQuadOnDLS(toEnum()); +} + +NeuronConfigBlockOnDLS SynapseLabelQuadOnDLS::toNeuronConfigBlockOnDLS() const +{ + return toSynapseQuadOnDLS().toNeuronConfigBlockOnDLS(); +} + +SynapseWeightQuadOnDLS SynapseLabelQuadOnDLS::toSynapseWeightQuadOnDLS() const +{ + return SynapseWeightQuadOnDLS(toEnum()); +} + +SynapseQuadOnDLS SynapseLabelQuadOnDLS::toSynapseQuadOnDLS() const +{ + return SynapseQuadOnDLS(toEnum()); +} + +SynapseCorrelationCalibQuadOnDLS SynapseLabelQuadOnDLS::toSynapseCorrelationCalibQuadOnDLS() const +{ + return SynapseCorrelationCalibQuadOnDLS(toEnum()); +} + +NeuronConfigBlockOnDLS SynapseCorrelationCalibQuadOnDLS::toNeuronConfigBlockOnDLS() const +{ + return toSynapseQuadOnDLS().toNeuronConfigBlockOnDLS(); +} + +SynapseWeightQuadOnDLS SynapseCorrelationCalibQuadOnDLS::toSynapseWeightQuadOnDLS() const +{ + return SynapseWeightQuadOnDLS(toEnum()); +} + +SynapseLabelQuadOnDLS SynapseCorrelationCalibQuadOnDLS::toSynapseLabelQuadOnDLS() const +{ + return SynapseLabelQuadOnDLS(toEnum()); +} + +SynapseQuadOnDLS SynapseCorrelationCalibQuadOnDLS::toSynapseQuadOnDLS() const +{ + return SynapseQuadOnDLS(toEnum()); +} + +NeuronColumnOnDLS SynapseOnSynapseRow::toNeuronColumnOnDLS() const +{ + return NeuronColumnOnDLS(toEnum()); +} + +CADCChannelColumnOnSynram SynapseOnSynapseRow::toCADCChannelColumnOnSynram() const +{ + return CADCChannelColumnOnSynram(toEnum()); +} + + +common::typed_array<NeuronColumnOnDLS, EntryOnQuad> SynapseQuadColumnOnDLS::toNeuronColumnOnDLS() + const +{ + common::typed_array<NeuronColumnOnDLS, EntryOnQuad> ret; + for (auto const e : common::iter_all<EntryOnQuad>()) { + ret[e] = NeuronColumnOnDLS( + ((toEnum() % (size / 2)) * EntryOnQuad::size + e.toEnum()) * 2 + + (toEnum() / (size / 2))); + } + return ret; +} + +NeuronConfigBlockOnDLS SynapseQuadOnDLS::toNeuronConfigBlockOnDLS() const +{ + bool east = toSynapseQuadColumnOnDLS() % (SynapseQuadColumnOnDLS::size / 2) >= + (SynapseQuadColumnOnDLS::size / 4); + return NeuronConfigBlockOnDLS(toSynramOnDLS().toEnum() * 2 + east); +} + +SynapseOnSynapseRow::SynapseOnSynapseRow( + EntryOnQuad const& syn_on_quad, SynapseQuadColumnOnDLS const& quad) : + rant_t( + (3 - syn_on_quad.toEnum()) * 2 + + (quad.toEnum() % (SynapseQuadColumnOnDLS::size / 2)) * EntryOnQuad::size * 2 + + quad.toEnum() / (SynapseQuadColumnOnDLS::size / 2)) +{} + +EntryOnQuad SynapseOnSynapseRow::toEntryOnQuad() const +{ + return EntryOnQuad(3 - ((toEnum() / 2) % EntryOnQuad::size)); +} + +SynapseQuadColumnOnDLS SynapseOnSynapseRow::toSynapseQuadColumnOnDLS() const +{ + return SynapseQuadColumnOnDLS( + ((toEnum() % 2) * SynapseQuadColumnOnDLS::size / 2) + (toEnum() / (2 * EntryOnQuad::size))); +} + } // namespace halco::hicann_dls::vx diff --git a/src/halco/hicann-dls/vx/v2/cadc.cpp b/src/halco/hicann-dls/vx/v2/cadc.cpp deleted file mode 100644 index 94917a38307b072e06d0d0cd9751f31509415467..0000000000000000000000000000000000000000 --- a/src/halco/hicann-dls/vx/v2/cadc.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include "halco/hicann-dls/vx/v2/cadc.h" - -#include "halco/hicann-dls/vx/v2/neuron.h" -#include "halco/hicann-dls/vx/v2/synapse.h" -#include "halco/hicann-dls/vx/v2/synram.h" - -namespace halco::hicann_dls::vx::v2 { - -#include "halco/hicann-dls/vx/cadc_ns_includes_impl.h" - -} // namespace halco::hicann_dls::vx::v2 diff --git a/src/halco/hicann-dls/vx/v2/neuron.cpp b/src/halco/hicann-dls/vx/v2/neuron.cpp deleted file mode 100644 index f31afc884726f1f2a98adb689e2e863720a67198..0000000000000000000000000000000000000000 --- a/src/halco/hicann-dls/vx/v2/neuron.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include "halco/hicann-dls/vx/v2/neuron.h" - -#ifndef __ppu__ -#include "halco/common/cerealization_geometry.h" -#include <cereal/archives/json.hpp> -#include <cereal/archives/portable_binary.hpp> -#include <cereal/cereal.hpp> -#include <cereal/types/map.hpp> -#include <cereal/types/vector.hpp> -#endif - -namespace halco::hicann_dls::vx::v2 { - -#include "halco/hicann-dls/vx/neuron_ns_includes_impl.h" - -#ifndef __ppu__ -#define EXPLICIT_INSTANTIATE_CEREAL_SERIALIZE(CLASS_NAME) \ - template void CLASS_NAME ::CEREAL_SERIALIZE_FUNCTION_NAME( \ - cereal::JSONOutputArchive&, std::uint32_t const); \ - template void CLASS_NAME ::CEREAL_SERIALIZE_FUNCTION_NAME( \ - cereal::JSONInputArchive&, std::uint32_t const); \ - template void CLASS_NAME ::CEREAL_SERIALIZE_FUNCTION_NAME( \ - cereal::PortableBinaryOutputArchive&, std::uint32_t const); \ - template void CLASS_NAME ::CEREAL_SERIALIZE_FUNCTION_NAME( \ - cereal::PortableBinaryInputArchive&, std::uint32_t const); - -EXPLICIT_INSTANTIATE_CEREAL_SERIALIZE(LogicalNeuronCompartments) -EXPLICIT_INSTANTIATE_CEREAL_SERIALIZE(LogicalNeuronOnDLS) -#endif - -} // namespace halco::hicann_dls::vx::v2 diff --git a/src/halco/hicann-dls/vx/v2/synapse.cpp b/src/halco/hicann-dls/vx/v2/synapse.cpp deleted file mode 100644 index 991cfad66f55f9f360379da907a3f5d4bccab9da..0000000000000000000000000000000000000000 --- a/src/halco/hicann-dls/vx/v2/synapse.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "halco/hicann-dls/vx/v2/synapse.h" - -#include "halco/common/iter_all.h" -#include "halco/hicann-dls/vx/v2/cadc.h" -#include "halco/hicann-dls/vx/v2/chip.h" -#include "halco/hicann-dls/vx/v2/correlation.h" -#include "halco/hicann-dls/vx/v2/neuron.h" -#include "halco/hicann-dls/vx/v2/padi.h" -#include "halco/hicann-dls/vx/v2/ppu.h" -#include "halco/hicann-dls/vx/v2/switch_rows.h" -#include "halco/hicann-dls/vx/v2/synapse_driver.h" - - -namespace halco::hicann_dls::vx::v2 { - -#include "halco/hicann-dls/vx/synapse_ns_includes_impl.h" - -common::typed_array<NeuronColumnOnDLS, EntryOnQuad> SynapseQuadColumnOnDLS::toNeuronColumnOnDLS() - const -{ - common::typed_array<NeuronColumnOnDLS, EntryOnQuad> ret; - for (auto const e : common::iter_all<EntryOnQuad>()) { - ret[e] = NeuronColumnOnDLS( - ((toEnum() % (size / 2)) * EntryOnQuad::size + e.toEnum()) * 2 + - (toEnum() / (size / 2))); - } - return ret; -} - -NeuronConfigBlockOnDLS SynapseQuadOnDLS::toNeuronConfigBlockOnDLS() const -{ - bool east = toSynapseQuadColumnOnDLS() % (SynapseQuadColumnOnDLS::size / 2) >= - (SynapseQuadColumnOnDLS::size / 4); - return NeuronConfigBlockOnDLS(toSynramOnDLS().toEnum() * 2 + east); -} - -SynapseOnSynapseRow::SynapseOnSynapseRow( - EntryOnQuad const& syn_on_quad, SynapseQuadColumnOnDLS const& quad) : - rant_t( - (3 - syn_on_quad.toEnum()) * 2 + - (quad.toEnum() % (SynapseQuadColumnOnDLS::size / 2)) * EntryOnQuad::size * 2 + - quad.toEnum() / (SynapseQuadColumnOnDLS::size / 2)) -{} - -EntryOnQuad SynapseOnSynapseRow::toEntryOnQuad() const -{ - return EntryOnQuad(3 - ((toEnum() / 2) % EntryOnQuad::size)); -} - -SynapseQuadColumnOnDLS SynapseOnSynapseRow::toSynapseQuadColumnOnDLS() const -{ - return SynapseQuadColumnOnDLS( - ((toEnum() % 2) * SynapseQuadColumnOnDLS::size / 2) + (toEnum() / (2 * EntryOnQuad::size))); -} - -} // namespace halco::hicann_dls::vx diff --git a/src/halco/hicann-dls/vx/v3/cadc.cpp b/src/halco/hicann-dls/vx/v3/cadc.cpp deleted file mode 100644 index c7897e235f62c5d6efc6b531fcf2afa966f9d3c6..0000000000000000000000000000000000000000 --- a/src/halco/hicann-dls/vx/v3/cadc.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include "halco/hicann-dls/vx/v3/cadc.h" - -#include "halco/hicann-dls/vx/v3/neuron.h" -#include "halco/hicann-dls/vx/v3/synapse.h" -#include "halco/hicann-dls/vx/v3/synram.h" - -namespace halco::hicann_dls::vx::v3 { - -#include "halco/hicann-dls/vx/cadc_ns_includes_impl.h" - -} // namespace halco::hicann_dls::vx::v3 diff --git a/src/halco/hicann-dls/vx/v3/neuron.cpp b/src/halco/hicann-dls/vx/v3/neuron.cpp deleted file mode 100644 index a40066735bfeb75c50b7dd51ac5000db192ebc92..0000000000000000000000000000000000000000 --- a/src/halco/hicann-dls/vx/v3/neuron.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include "halco/hicann-dls/vx/v3/neuron.h" - -#ifndef __ppu__ -#include "halco/common/cerealization_geometry.h" -#include <cereal/archives/json.hpp> -#include <cereal/archives/portable_binary.hpp> -#include <cereal/cereal.hpp> -#include <cereal/types/map.hpp> -#include <cereal/types/vector.hpp> -#endif - -namespace halco::hicann_dls::vx::v3 { - -#include "halco/hicann-dls/vx/neuron_ns_includes_impl.h" - -#ifndef __ppu__ -#define EXPLICIT_INSTANTIATE_CEREAL_SERIALIZE(CLASS_NAME) \ - template void CLASS_NAME ::CEREAL_SERIALIZE_FUNCTION_NAME( \ - cereal::JSONOutputArchive&, std::uint32_t const); \ - template void CLASS_NAME ::CEREAL_SERIALIZE_FUNCTION_NAME( \ - cereal::JSONInputArchive&, std::uint32_t const); \ - template void CLASS_NAME ::CEREAL_SERIALIZE_FUNCTION_NAME( \ - cereal::PortableBinaryOutputArchive&, std::uint32_t const); \ - template void CLASS_NAME ::CEREAL_SERIALIZE_FUNCTION_NAME( \ - cereal::PortableBinaryInputArchive&, std::uint32_t const); - -EXPLICIT_INSTANTIATE_CEREAL_SERIALIZE(LogicalNeuronCompartments) -EXPLICIT_INSTANTIATE_CEREAL_SERIALIZE(LogicalNeuronOnDLS) -#endif - -} // namespace halco::hicann_dls::vx::v3 diff --git a/src/halco/hicann-dls/vx/v3/synapse.cpp b/src/halco/hicann-dls/vx/v3/synapse.cpp deleted file mode 100644 index 98c1f100db95eee625c4dff5e9bca7c847e99e44..0000000000000000000000000000000000000000 --- a/src/halco/hicann-dls/vx/v3/synapse.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "halco/hicann-dls/vx/v3/synapse.h" - -#include "halco/common/iter_all.h" -#include "halco/hicann-dls/vx/v3/cadc.h" -#include "halco/hicann-dls/vx/v3/chip.h" -#include "halco/hicann-dls/vx/v3/correlation.h" -#include "halco/hicann-dls/vx/v3/neuron.h" -#include "halco/hicann-dls/vx/v3/padi.h" -#include "halco/hicann-dls/vx/v3/ppu.h" -#include "halco/hicann-dls/vx/v3/switch_rows.h" -#include "halco/hicann-dls/vx/v3/synapse_driver.h" - - -namespace halco::hicann_dls::vx::v3 { - -#include "halco/hicann-dls/vx/synapse_ns_includes_impl.h" - -common::typed_array<NeuronColumnOnDLS, EntryOnQuad> SynapseQuadColumnOnDLS::toNeuronColumnOnDLS() - const -{ - common::typed_array<NeuronColumnOnDLS, EntryOnQuad> ret; - for (auto const e : common::iter_all<EntryOnQuad>()) { - ret[e] = NeuronColumnOnDLS( - ((toEnum() % (size / 2)) * EntryOnQuad::size + e.toEnum()) * 2 + - (toEnum() / (size / 2))); - } - return ret; -} - -NeuronConfigBlockOnDLS SynapseQuadOnDLS::toNeuronConfigBlockOnDLS() const -{ - bool east = toSynapseQuadColumnOnDLS() % (SynapseQuadColumnOnDLS::size / 2) >= - (SynapseQuadColumnOnDLS::size / 4); - return NeuronConfigBlockOnDLS(toSynramOnDLS().toEnum() * 2 + east); -} - -SynapseOnSynapseRow::SynapseOnSynapseRow( - EntryOnQuad const& syn_on_quad, SynapseQuadColumnOnDLS const& quad) : - rant_t( - (3 - syn_on_quad.toEnum()) * 2 + - (quad.toEnum() % (SynapseQuadColumnOnDLS::size / 2)) * EntryOnQuad::size * 2 + - quad.toEnum() / (SynapseQuadColumnOnDLS::size / 2)) -{} - -EntryOnQuad SynapseOnSynapseRow::toEntryOnQuad() const -{ - return EntryOnQuad(3 - ((toEnum() / 2) % EntryOnQuad::size)); -} - -SynapseQuadColumnOnDLS SynapseOnSynapseRow::toSynapseQuadColumnOnDLS() const -{ - return SynapseQuadColumnOnDLS( - ((toEnum() % 2) * SynapseQuadColumnOnDLS::size / 2) + (toEnum() / (2 * EntryOnQuad::size))); -} - -} // namespace halco::hicann_dls::vx