OpenFPGA/vpr7_x2p/vpr/SRC/device/decoder_library.h

89 lines
3.4 KiB
C++

/***************************************************************************************
* 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<DecoderId, DecoderId>::const_iterator decoder_iterator;
typedef vtr::Range<decoder_iterator> 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<DecoderId, DecoderId> decoder_ids_;
vtr::vector<DecoderId, size_t> addr_sizes_;
vtr::vector<DecoderId, size_t> data_sizes_;
vtr::vector<DecoderId, bool> use_enable_;
vtr::vector<DecoderId, bool> use_data_in_;
vtr::vector<DecoderId, bool> use_data_inv_port_;
};
#endif