[FPGA-Bitstream] Add a new data structure that stores fabric bitstream for memory bank using shift registers
This commit is contained in:
parent
43c569b612
commit
4526133089
|
@ -0,0 +1,77 @@
|
|||
#include "vtr_assert.h"
|
||||
#include "memory_bank_shift_register_fabric_bitstream.h"
|
||||
|
||||
/* begin namespace openfpga */
|
||||
namespace openfpga {
|
||||
|
||||
MemoryBankShiftRegisterFabricBitstream::word_range MemoryBankShiftRegisterFabricBitstream::words() const {
|
||||
return vtr::make_range(bitstream_word_ids_.begin(), bitstream_word_ids_.end());
|
||||
}
|
||||
|
||||
size_t MemoryBankShiftRegisterFabricBitstream::num_words() const {
|
||||
return bitstream_word_ids_.size();
|
||||
}
|
||||
|
||||
size_t MemoryBankShiftRegisterFabricBitstream::word_size() const {
|
||||
/* For a fast runtime, we just inspect the last element
|
||||
* It is the validator which should ensure all the words have a uniform size
|
||||
*/
|
||||
return bitstream_word_bls_[bitstream_word_ids_.back()].size();
|
||||
}
|
||||
|
||||
size_t MemoryBankShiftRegisterFabricBitstream::bl_width() const {
|
||||
/* For a fast runtime, we just inspect the last element
|
||||
* It is the validator which should ensure all the words have a uniform size
|
||||
*/
|
||||
return bitstream_word_bls_[bitstream_word_ids_.back()].back().size();
|
||||
}
|
||||
|
||||
size_t MemoryBankShiftRegisterFabricBitstream::wl_width() const {
|
||||
/* For a fast runtime, we just inspect the last element
|
||||
* It is the validator which should ensure all the words have a uniform size
|
||||
*/
|
||||
return bitstream_word_wls_[bitstream_word_ids_.back()].back().size();
|
||||
}
|
||||
|
||||
std::vector<std::string> MemoryBankShiftRegisterFabricBitstream::bl_vectors(const MemoryBankShiftRegisterFabricBitstreamWordId& word_id) const {
|
||||
VTR_ASSERT(valid_word_id(word_id));
|
||||
return bitstream_word_bls_[word_id];
|
||||
}
|
||||
|
||||
std::vector<std::string> MemoryBankShiftRegisterFabricBitstream::wl_vectors(const MemoryBankShiftRegisterFabricBitstreamWordId& word_id) const {
|
||||
VTR_ASSERT(valid_word_id(word_id));
|
||||
return bitstream_word_wls_[word_id];
|
||||
}
|
||||
|
||||
MemoryBankShiftRegisterFabricBitstreamWordId MemoryBankShiftRegisterFabricBitstream::create_word() {
|
||||
/* Create a new id*/
|
||||
MemoryBankShiftRegisterFabricBitstreamWordId word_id = MemoryBankShiftRegisterFabricBitstreamWordId(bitstream_word_ids_.size());
|
||||
/* Update the id list */
|
||||
bitstream_word_ids_.push_back(word_id);
|
||||
|
||||
/* Initialize other attributes */
|
||||
bitstream_word_bls_.emplace_back();
|
||||
bitstream_word_wls_.emplace_back();
|
||||
|
||||
return word_id;
|
||||
}
|
||||
|
||||
void MemoryBankShiftRegisterFabricBitstream::add_bl_vectors(const MemoryBankShiftRegisterFabricBitstreamWordId& word_id,
|
||||
const std::string& bl_vec) {
|
||||
VTR_ASSERT(valid_word_id(word_id));
|
||||
VTR_ASSERT(bl_vec.size() == bl_width());
|
||||
return bitstream_word_bls_[word_id].push_back(bl_vec);
|
||||
}
|
||||
|
||||
void MemoryBankShiftRegisterFabricBitstream::add_wl_vectors(const MemoryBankShiftRegisterFabricBitstreamWordId& word_id,
|
||||
const std::string& wl_vec) {
|
||||
VTR_ASSERT(valid_word_id(word_id));
|
||||
VTR_ASSERT(wl_vec.size() == wl_width());
|
||||
return bitstream_word_wls_[word_id].push_back(wl_vec);
|
||||
}
|
||||
|
||||
bool MemoryBankShiftRegisterFabricBitstream::valid_word_id(const MemoryBankShiftRegisterFabricBitstreamWordId& word_id) const {
|
||||
return ( size_t(word_id) < bitstream_word_ids_.size() ) && ( word_id == bitstream_word_ids_[word_id] );
|
||||
}
|
||||
|
||||
} /* end namespace openfpga */
|
|
@ -0,0 +1,93 @@
|
|||
#ifndef MEMORY_BANK_SHIFT_REGISTER_FABRIC_BITSTREAM_H
|
||||
#define MEMORY_BANK_SHIFT_REGISTER_FABRIC_BITSTREAM_H
|
||||
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include "vtr_vector.h"
|
||||
#include "memory_bank_shift_register_fabric_bitstream_fwd.h"
|
||||
|
||||
/* begin namespace openfpga */
|
||||
namespace openfpga {
|
||||
|
||||
/******************************************************************************
|
||||
* This files includes data structures that stores a downloadable format of fabric bitstream
|
||||
* which is compatible with memory bank configuration protocol using shift register to control BL/WLs
|
||||
* @note This data structure is mainly used to output bitstream file for compatible protocols
|
||||
******************************************************************************/
|
||||
class MemoryBankShiftRegisterFabricBitstream {
|
||||
public: /* Types */
|
||||
typedef vtr::vector<MemoryBankShiftRegisterFabricBitstreamWordId, MemoryBankShiftRegisterFabricBitstreamWordId>::const_iterator word_iterator;
|
||||
/* Create range */
|
||||
typedef vtr::Range<word_iterator> word_range;
|
||||
|
||||
public: /* Accessors: aggregates */
|
||||
word_range words() const;
|
||||
|
||||
public: /* Accessors */
|
||||
/* @brief Return the length of bitstream */
|
||||
size_t num_words() const;
|
||||
|
||||
/* @brief Return the length of each word. All the word should have a uniform size */
|
||||
size_t word_size() const;
|
||||
|
||||
/* @brief Return the width of each BL word, which is the number of heads through which a BL word can be loaded in parallel */
|
||||
size_t bl_width() const;
|
||||
|
||||
/* @brief Return the width of each WL word, which is the number of heads through which a WL word can be loaded in parallel */
|
||||
size_t wl_width() const;
|
||||
|
||||
/* @brief Return the BL vectors with a given word id*/
|
||||
std::vector<std::string> bl_vectors(const MemoryBankShiftRegisterFabricBitstreamWordId& word_id) const;
|
||||
|
||||
/* @brief Return the WL vectors in a given word id */
|
||||
std::vector<std::string> wl_vectors(const MemoryBankShiftRegisterFabricBitstreamWordId& word_id) const;
|
||||
|
||||
public: /* Mutators */
|
||||
/* @brief Create a new word */
|
||||
MemoryBankShiftRegisterFabricBitstreamWordId create_word();
|
||||
|
||||
/* @brief Add BLs to a given word */
|
||||
void add_bl_vectors(const MemoryBankShiftRegisterFabricBitstreamWordId& word_id,
|
||||
const std::string& bl_vec);
|
||||
|
||||
/* @brief Add WLs to a given word */
|
||||
void add_wl_vectors(const MemoryBankShiftRegisterFabricBitstreamWordId& word_id,
|
||||
const std::string& wl_vec);
|
||||
|
||||
public: /* Validators */
|
||||
bool valid_word_id(const MemoryBankShiftRegisterFabricBitstreamWordId& word_id) const;
|
||||
|
||||
private: /* Internal data */
|
||||
/* Organization of the bitstream
|
||||
*
|
||||
* ============= Begin of Word 1 ==============
|
||||
* |<--No of -->|<-- No of -->|
|
||||
* | BL heads | WL heads |
|
||||
* 010101 .. 101 101110 .. 001 ----
|
||||
* ... ... ^
|
||||
* |
|
||||
* max. shift register length per word
|
||||
* |
|
||||
* v
|
||||
* 110001 .. 111 100100 .. 110 ----
|
||||
* ============= End of Word 1 ==============
|
||||
* ============= Begin of Word 2 ==============
|
||||
* 010101 .. 101 101110 .. 001 ----
|
||||
* ... ... ^
|
||||
* |
|
||||
* max. shift register length per word
|
||||
* |
|
||||
* v
|
||||
* 110001 .. 111 100100 .. 110 ----
|
||||
* ============= End of Word 2 ==============
|
||||
* .... more words
|
||||
*/
|
||||
vtr::vector<MemoryBankShiftRegisterFabricBitstreamWordId, MemoryBankShiftRegisterFabricBitstreamWordId> bitstream_word_ids_;
|
||||
vtr::vector<MemoryBankShiftRegisterFabricBitstreamWordId, std::vector<std::string>> bitstream_word_bls_;
|
||||
vtr::vector<MemoryBankShiftRegisterFabricBitstreamWordId, std::vector<std::string>> bitstream_word_wls_;
|
||||
};
|
||||
|
||||
} /* end namespace openfpga */
|
||||
|
||||
#endif
|
|
@ -0,0 +1,23 @@
|
|||
/**************************************************
|
||||
* This file includes only declarations for
|
||||
* the data structures for MemoryBankShiftRegisterFabricBitstream
|
||||
* Please refer to memory_bank_shift_register_fabric_bitstream.h for more details
|
||||
*************************************************/
|
||||
#ifndef MEMORY_BANK_SHIFT_REGISTER_FABRIC_BITSTREAM_FWD_H
|
||||
#define MEMORY_BANK_SHIFT_REGISTER_FABRIC_BITSTREAM_FWD_H
|
||||
|
||||
#include "vtr_strong_id.h"
|
||||
|
||||
/* begin namespace openfpga */
|
||||
namespace openfpga {
|
||||
|
||||
/* Strong Ids for ModuleManager */
|
||||
struct memory_bank_shift_register_fabric_bitstream_word_id_tag;
|
||||
|
||||
typedef vtr::StrongId<memory_bank_shift_register_fabric_bitstream_word_id_tag> MemoryBankShiftRegisterFabricBitstreamWordId;
|
||||
|
||||
class MemoryBankShiftRegisterFabricBitstream;
|
||||
|
||||
} /* end namespace openfpga */
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue