| #ifndef LOGIC_VEC_H |
| #define LOGIC_VEC_H |
| |
| #include <vector> |
| #include <ostream> |
| |
| #include "vtr_logic.h" |
| |
| std::ostream& operator<<(std::ostream& os, vtr::LogicValue val); |
| |
| //A vector-like object containing logic values. |
| class LogicVec { |
| public: |
| LogicVec() = default; |
| LogicVec(size_t size_val, //Number of logic values |
| vtr::LogicValue init_value) //Default value |
| : values_(size_val, init_value) {} |
| LogicVec(std::vector<vtr::LogicValue> values) |
| : values_(values) {} |
| |
| //Array indexing operator |
| const vtr::LogicValue& operator[](size_t i) const { return values_[i]; } |
| vtr::LogicValue& operator[](size_t i) { return values_[i]; } |
| |
| // Size accessor |
| size_t size() const { return values_.size(); } |
| |
| //Output operator which writes the logic vector in verilog format |
| friend std::ostream& operator<<(std::ostream& os, LogicVec logic_vec) { |
| os << logic_vec.values_.size() << "'b"; |
| //Print in reverse since th convention is MSB on the left, LSB on the right |
| //but we store things in array order (putting LSB on left, MSB on right) |
| for (auto iter = logic_vec.begin(); iter != logic_vec.end(); iter++) { |
| os << *iter; |
| } |
| return os; |
| } |
| |
| //Standard iterators |
| std::vector<vtr::LogicValue>::reverse_iterator begin() { return values_.rbegin(); } |
| std::vector<vtr::LogicValue>::reverse_iterator end() { return values_.rend(); } |
| std::vector<vtr::LogicValue>::const_reverse_iterator begin() const { return values_.crbegin(); } |
| std::vector<vtr::LogicValue>::const_reverse_iterator end() const { return values_.crend(); } |
| |
| private: |
| std::vector<vtr::LogicValue> values_; //The logic values |
| }; |
| |
| #endif |