2014-07-23 22:39:29 +02:00
|
|
|
#ifndef IVL_vvp_darray_H
|
|
|
|
|
#define IVL_vvp_darray_H
|
2012-11-21 02:40:52 +01:00
|
|
|
/*
|
2025-07-22 08:30:57 +02:00
|
|
|
* Copyright (c) 2012-2025 Stephen Williams (steve@icarus.com)
|
2012-11-21 02:40:52 +01:00
|
|
|
*
|
|
|
|
|
* This source code is free software; you can redistribute it
|
|
|
|
|
* and/or modify it in source code form under the terms of the GNU
|
|
|
|
|
* General Public License as published by the Free Software
|
|
|
|
|
* Foundation; either version 2 of the License, or (at your option)
|
|
|
|
|
* any later version.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
# include "vvp_object.h"
|
2015-02-27 02:55:45 +01:00
|
|
|
# include "vvp_net.h"
|
2020-07-22 05:00:09 +02:00
|
|
|
# include <deque>
|
2012-11-21 02:40:52 +01:00
|
|
|
# include <string>
|
|
|
|
|
# include <vector>
|
|
|
|
|
|
|
|
|
|
class vvp_darray : public vvp_object {
|
|
|
|
|
|
|
|
|
|
public:
|
2014-08-10 05:43:53 +02:00
|
|
|
inline vvp_darray() { }
|
2025-10-13 22:14:57 +02:00
|
|
|
virtual ~vvp_darray() override;
|
2012-11-21 02:40:52 +01:00
|
|
|
|
2014-08-10 05:43:53 +02:00
|
|
|
virtual size_t get_size(void) const =0;
|
2012-11-21 02:40:52 +01:00
|
|
|
|
|
|
|
|
virtual void set_word(unsigned adr, const vvp_vector4_t&value);
|
|
|
|
|
virtual void get_word(unsigned adr, vvp_vector4_t&value);
|
|
|
|
|
|
|
|
|
|
virtual void set_word(unsigned adr, double value);
|
|
|
|
|
virtual void get_word(unsigned adr, double&value);
|
|
|
|
|
|
|
|
|
|
virtual void set_word(unsigned adr, const std::string&value);
|
|
|
|
|
virtual void get_word(unsigned adr, std::string&value);
|
2014-08-30 05:31:51 +02:00
|
|
|
|
|
|
|
|
virtual void set_word(unsigned adr, const vvp_object_t&value);
|
|
|
|
|
virtual void get_word(unsigned adr, vvp_object_t&value);
|
2017-10-08 14:52:50 +02:00
|
|
|
|
2019-09-11 22:56:27 +02:00
|
|
|
virtual vvp_vector4_t get_bitstream(bool as_vec4);
|
2012-11-21 02:40:52 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
template <class TYPE> class vvp_darray_atom : public vvp_darray {
|
|
|
|
|
|
|
|
|
|
public:
|
2015-10-22 11:45:31 +02:00
|
|
|
explicit inline vvp_darray_atom(size_t siz) : array_(siz) { }
|
2025-10-13 22:14:57 +02:00
|
|
|
~vvp_darray_atom() override;
|
2012-11-21 02:40:52 +01:00
|
|
|
|
2025-07-22 08:30:57 +02:00
|
|
|
size_t get_size(void) const override;
|
|
|
|
|
void set_word(unsigned adr, const vvp_vector4_t&value) override;
|
|
|
|
|
void get_word(unsigned adr, vvp_vector4_t&value) override;
|
|
|
|
|
void shallow_copy(const vvp_object*obj) override;
|
|
|
|
|
vvp_object* duplicate(void) const override;
|
|
|
|
|
vvp_vector4_t get_bitstream(bool as_vec4) override;
|
2012-11-21 02:40:52 +01:00
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
std::vector<TYPE> array_;
|
|
|
|
|
};
|
|
|
|
|
|
2015-02-27 02:55:45 +01:00
|
|
|
class vvp_darray_vec4 : public vvp_darray {
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
inline vvp_darray_vec4(size_t siz, unsigned word_wid) :
|
|
|
|
|
array_(siz), word_wid_(word_wid) { }
|
|
|
|
|
~vvp_darray_vec4();
|
|
|
|
|
|
2025-07-22 08:30:57 +02:00
|
|
|
size_t get_size(void) const override;
|
|
|
|
|
void set_word(unsigned adr, const vvp_vector4_t&value) override;
|
|
|
|
|
void get_word(unsigned adr, vvp_vector4_t&value) override;
|
|
|
|
|
void shallow_copy(const vvp_object*obj) override;
|
|
|
|
|
vvp_object* duplicate(void) const override;
|
|
|
|
|
vvp_vector4_t get_bitstream(bool as_vec4) override;
|
2015-02-27 02:55:45 +01:00
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
std::vector<vvp_vector4_t> array_;
|
|
|
|
|
unsigned word_wid_;
|
|
|
|
|
};
|
|
|
|
|
|
2015-02-27 20:39:57 +01:00
|
|
|
class vvp_darray_vec2 : public vvp_darray {
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
inline vvp_darray_vec2(size_t siz, unsigned word_wid) :
|
|
|
|
|
array_(siz), word_wid_(word_wid) { }
|
|
|
|
|
~vvp_darray_vec2();
|
|
|
|
|
|
2025-07-22 08:30:57 +02:00
|
|
|
size_t get_size(void) const override;
|
|
|
|
|
void set_word(unsigned adr, const vvp_vector4_t&value) override;
|
|
|
|
|
void get_word(unsigned adr, vvp_vector4_t&value) override;
|
|
|
|
|
void shallow_copy(const vvp_object*obj) override;
|
|
|
|
|
vvp_vector4_t get_bitstream(bool as_vec4) override;
|
2015-02-27 20:39:57 +01:00
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
std::vector<vvp_vector2_t> array_;
|
|
|
|
|
unsigned word_wid_;
|
|
|
|
|
};
|
|
|
|
|
|
2012-11-21 02:40:52 +01:00
|
|
|
class vvp_darray_real : public vvp_darray {
|
|
|
|
|
|
|
|
|
|
public:
|
2015-10-22 11:45:31 +02:00
|
|
|
explicit inline vvp_darray_real(size_t siz) : array_(siz) { }
|
2012-11-21 02:40:52 +01:00
|
|
|
~vvp_darray_real();
|
|
|
|
|
|
2025-07-22 08:30:57 +02:00
|
|
|
size_t get_size(void) const override;
|
|
|
|
|
void set_word(unsigned adr, double value) override;
|
|
|
|
|
void get_word(unsigned adr, double&value) override;
|
|
|
|
|
void shallow_copy(const vvp_object*obj) override;
|
|
|
|
|
vvp_object* duplicate(void) const override;
|
|
|
|
|
vvp_vector4_t get_bitstream(bool as_vec4) override;
|
2012-11-21 02:40:52 +01:00
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
std::vector<double> array_;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class vvp_darray_string : public vvp_darray {
|
|
|
|
|
|
|
|
|
|
public:
|
2015-10-22 11:45:31 +02:00
|
|
|
explicit inline vvp_darray_string(size_t siz) : array_(siz) { }
|
2012-11-21 02:40:52 +01:00
|
|
|
~vvp_darray_string();
|
|
|
|
|
|
2025-07-22 08:30:57 +02:00
|
|
|
size_t get_size(void) const override;
|
|
|
|
|
void set_word(unsigned adr, const std::string&value) override;
|
|
|
|
|
void get_word(unsigned adr, std::string&value) override;
|
|
|
|
|
void shallow_copy(const vvp_object*obj) override;
|
|
|
|
|
vvp_object* duplicate(void) const override;
|
2012-11-21 02:40:52 +01:00
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
std::vector<std::string> array_;
|
|
|
|
|
};
|
|
|
|
|
|
2014-08-30 05:31:51 +02:00
|
|
|
class vvp_darray_object : public vvp_darray {
|
|
|
|
|
|
|
|
|
|
public:
|
2015-10-22 11:45:31 +02:00
|
|
|
explicit inline vvp_darray_object(size_t siz) : array_(siz) { }
|
2014-08-30 05:31:51 +02:00
|
|
|
~vvp_darray_object();
|
|
|
|
|
|
2025-07-22 08:30:57 +02:00
|
|
|
size_t get_size(void) const override;
|
|
|
|
|
void set_word(unsigned adr, const vvp_object_t&value) override;
|
|
|
|
|
void get_word(unsigned adr, vvp_object_t&value) override;
|
|
|
|
|
void shallow_copy(const vvp_object*obj) override;
|
2020-11-26 21:35:16 +01:00
|
|
|
//virtual vvp_object* duplicate(void) const;
|
2014-08-30 05:31:51 +02:00
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
std::vector<vvp_object_t> array_;
|
|
|
|
|
};
|
2012-11-21 02:40:52 +01:00
|
|
|
|
2014-08-05 05:11:21 +02:00
|
|
|
class vvp_queue : public vvp_darray {
|
|
|
|
|
|
|
|
|
|
public:
|
2014-08-10 05:43:53 +02:00
|
|
|
inline vvp_queue(void) { }
|
2014-08-05 05:11:21 +02:00
|
|
|
~vvp_queue();
|
|
|
|
|
|
2025-07-22 08:30:57 +02:00
|
|
|
virtual size_t get_size(void) const override =0;
|
2020-08-07 09:21:28 +02:00
|
|
|
virtual void copy_elems(vvp_object_t src, unsigned max_size);
|
|
|
|
|
|
2020-07-28 06:55:52 +02:00
|
|
|
virtual void set_word_max(unsigned adr, const vvp_vector4_t&value, unsigned max_size);
|
2020-07-30 07:59:16 +02:00
|
|
|
virtual void insert(unsigned idx, const vvp_vector4_t&value, unsigned max_size);
|
2020-07-17 10:30:23 +02:00
|
|
|
virtual void push_back(const vvp_vector4_t&value, unsigned max_size);
|
|
|
|
|
virtual void push_front(const vvp_vector4_t&value, unsigned max_size);
|
2014-08-05 05:11:21 +02:00
|
|
|
|
2020-07-28 06:55:52 +02:00
|
|
|
virtual void set_word_max(unsigned adr, double value, unsigned max_size);
|
2020-07-30 07:59:16 +02:00
|
|
|
virtual void insert(unsigned idx, double value, unsigned max_size);
|
2020-07-17 10:30:23 +02:00
|
|
|
virtual void push_back(double value, unsigned max_size);
|
|
|
|
|
virtual void push_front(double value, unsigned max_size);
|
2014-08-05 05:11:21 +02:00
|
|
|
|
2020-07-28 06:55:52 +02:00
|
|
|
virtual void set_word_max(unsigned adr, const std::string&value, unsigned max_size);
|
2020-07-30 07:59:16 +02:00
|
|
|
virtual void insert(unsigned idx, const std::string&value, unsigned max_size);
|
2020-07-17 10:30:23 +02:00
|
|
|
virtual void push_back(const std::string&value, unsigned max_size);
|
|
|
|
|
virtual void push_front(const std::string&value, unsigned max_size);
|
2014-08-18 03:36:47 +02:00
|
|
|
|
|
|
|
|
virtual void pop_back(void) =0;
|
|
|
|
|
virtual void pop_front(void)=0;
|
2020-07-25 09:48:57 +02:00
|
|
|
virtual void erase(unsigned idx)=0;
|
2020-08-03 08:34:52 +02:00
|
|
|
virtual void erase_tail(unsigned idx)=0;
|
2014-08-05 05:11:21 +02:00
|
|
|
};
|
|
|
|
|
|
2020-07-20 06:34:04 +02:00
|
|
|
class vvp_queue_real : public vvp_queue {
|
2014-08-05 05:11:21 +02:00
|
|
|
|
|
|
|
|
public:
|
2025-10-13 22:14:57 +02:00
|
|
|
~vvp_queue_real() override;
|
2014-08-05 05:11:21 +02:00
|
|
|
|
2025-07-22 08:30:57 +02:00
|
|
|
size_t get_size(void) const override { return queue.size(); };
|
|
|
|
|
void copy_elems(vvp_object_t src, unsigned max_size) override;
|
|
|
|
|
void set_word_max(unsigned adr, double value, unsigned max_size) override;
|
|
|
|
|
void set_word(unsigned adr, double value) override;
|
|
|
|
|
void get_word(unsigned adr, double&value) override;
|
|
|
|
|
void insert(unsigned idx, double value, unsigned max_size) override;
|
|
|
|
|
void push_back(double value, unsigned max_size) override;
|
|
|
|
|
void push_front(double value, unsigned max_size) override;
|
|
|
|
|
void pop_back(void) override { queue.pop_back(); };
|
|
|
|
|
void pop_front(void) override { queue.pop_front(); };
|
|
|
|
|
void erase(unsigned idx) override;
|
|
|
|
|
void erase_tail(unsigned idx) override;
|
2014-08-05 05:11:21 +02:00
|
|
|
|
|
|
|
|
private:
|
2020-07-22 05:00:09 +02:00
|
|
|
std::deque<double> queue;
|
2014-08-05 05:11:21 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class vvp_queue_string : public vvp_queue {
|
|
|
|
|
|
|
|
|
|
public:
|
2025-10-13 22:14:57 +02:00
|
|
|
~vvp_queue_string() override;
|
2014-08-05 05:11:21 +02:00
|
|
|
|
2025-07-22 08:30:57 +02:00
|
|
|
size_t get_size(void) const override { return queue.size(); };
|
|
|
|
|
void copy_elems(vvp_object_t src, unsigned max_size) override;
|
|
|
|
|
void set_word_max(unsigned adr, const std::string&value, unsigned max_size) override;
|
|
|
|
|
void set_word(unsigned adr, const std::string&value) override;
|
|
|
|
|
void get_word(unsigned adr, std::string&value) override;
|
|
|
|
|
void insert(unsigned idx, const std::string&value, unsigned max_size) override;
|
|
|
|
|
void push_back(const std::string&value, unsigned max_size) override;
|
|
|
|
|
void push_front(const std::string&value, unsigned max_size) override;
|
|
|
|
|
void pop_back(void) override { queue.pop_back(); };
|
|
|
|
|
void pop_front(void) override { queue.pop_front(); };
|
|
|
|
|
void erase(unsigned idx) override;
|
|
|
|
|
void erase_tail(unsigned idx) override;
|
2014-08-05 05:11:21 +02:00
|
|
|
|
|
|
|
|
private:
|
2020-07-22 05:00:09 +02:00
|
|
|
std::deque<std::string> queue;
|
2014-08-05 05:11:21 +02:00
|
|
|
};
|
|
|
|
|
|
2020-07-20 06:34:04 +02:00
|
|
|
class vvp_queue_vec4 : public vvp_queue {
|
|
|
|
|
|
|
|
|
|
public:
|
2025-10-13 22:14:57 +02:00
|
|
|
~vvp_queue_vec4() override;
|
2020-07-20 06:34:04 +02:00
|
|
|
|
2025-07-22 08:30:57 +02:00
|
|
|
size_t get_size(void) const override { return queue.size(); };
|
|
|
|
|
void copy_elems(vvp_object_t src, unsigned max_size) override;
|
|
|
|
|
void set_word_max(unsigned adr, const vvp_vector4_t&value, unsigned max_size) override;
|
|
|
|
|
void set_word(unsigned adr, const vvp_vector4_t&value) override;
|
|
|
|
|
void get_word(unsigned adr, vvp_vector4_t&value) override;
|
|
|
|
|
void insert(unsigned idx, const vvp_vector4_t&value, unsigned max_size) override;
|
|
|
|
|
void push_back(const vvp_vector4_t&value, unsigned max_size) override;
|
|
|
|
|
void push_front(const vvp_vector4_t&value, unsigned max_size) override;
|
|
|
|
|
void pop_back(void) override { queue.pop_back(); };
|
|
|
|
|
void pop_front(void) override { queue.pop_front(); };
|
|
|
|
|
void erase(unsigned idx) override;
|
|
|
|
|
void erase_tail(unsigned idx) override;
|
2020-07-20 06:34:04 +02:00
|
|
|
|
|
|
|
|
private:
|
2020-07-22 05:00:09 +02:00
|
|
|
std::deque<vvp_vector4_t> queue;
|
2020-07-20 06:34:04 +02:00
|
|
|
};
|
|
|
|
|
|
2021-11-04 18:02:07 +01:00
|
|
|
extern std::string get_fileline();
|
2020-08-11 06:57:50 +02:00
|
|
|
|
2014-07-23 22:39:29 +02:00
|
|
|
#endif /* IVL_vvp_darray_H */
|