/*************************************************************************************** * This file includes key data structures to describe decoders which are used * in FPGA fabrics * A decoder is a circuit to convert a binary input to one-hot codes * The outputs are assumes to be one-hot codes (at most only one '1' exist) * Therefore, the number of inputs is ceil(log(num_of_outputs)/log(2)) * All the decoders are assumed to follow the port map : * * Inputs * | | ... | * v v v * +-----------+ * / \ * / Decoder \ * +-----------------+ * | | | ... | | | * v v v v v v * Outputs ***************************************************************************************/ #ifndef DECODER_LIBRARY_H #define DECODER_LIBRARY_H #include "vtr_vector.h" #include "vtr_range.h" #include "decoder_library_fwd.h" class DecoderLibrary { public: /* Types and ranges */ typedef vtr::vector::const_iterator decoder_iterator; typedef vtr::Range decoder_range; public: /* Public accessors: Aggregates */ /* Get all the decoders */ decoder_range decoders() const; public: /* Public accessors: Data query */ /* Get the size of address input of a decoder */ size_t addr_size(const DecoderId& decoder) const; /* Get the size of data output of a decoder */ size_t data_size(const DecoderId& decoder) const; /* Get the flag if a decoder includes an ENABLE signal */ bool use_enable(const DecoderId& decoder) const; /* Get the flag if a decoder includes an DATA_IN signal */ bool use_data_in(const DecoderId& decoder) const; /* Get the flag if a decoder includes a data_inv port which is an inversion of the regular data output port */ bool use_data_inv_port(const DecoderId& decoder) const; /* Find a decoder to the library, with the specification. * If found, return the id of decoder. * If not found, return an invalid id of decoder * To avoid duplicated decoders, this function should be used before adding a decoder * Example: * DecoderId decoder_id == decoder_lib.find_decoder(); * if (DecoderId::INVALID() == decoder_id) { * // Add decoder * } */ DecoderId find_decoder(const size_t& addr_size, const size_t& data_size, const bool& use_enable, const bool& use_data_in, const bool& use_data_inv_port) const; public: /* Public validators */ /* valid ids */ bool valid_decoder_id(const DecoderId& decoder) const; public: /* Private mutators : basic operations */ /* Add a decoder to the library */ DecoderId add_decoder(const size_t& addr_size, const size_t& data_size, const bool& use_enable, const bool& use_data_in, const bool& use_data_inv_port); private: /* Internal Data */ vtr::vector decoder_ids_; vtr::vector addr_sizes_; vtr::vector data_sizes_; vtr::vector use_enable_; vtr::vector use_data_in_; vtr::vector use_data_inv_port_; }; #endif