Alaba Posted July 21, 2020 Report Share Posted July 21, 2020 Hello I 'm trying to create an nxn array (nested vectors) of an rc component, with each having different r,c values ex: rc[0][0] (r=10,c=5), rc[1][1] (r=3,c=4)..... I've created the rc sub module that take the values of R and C as arguments, As follows: SC_MODULE (rc){ sca_eln::sca_terminal n; sca_eln::sca_terminal p; sca_eln::sca_r r1; sca_eln::sca_c c1; sca_eln::sca_node n1; rc( sc_core::sc_module_name nm , double r0_,double c0_) :p("p"),n("n"), r1("r1"),c1("c1"), r0(r0_),c0(c0_) { r1.p(p); r1.n(n1); r1.value=r0; c1.p(n1); c1.n(n); c1.value=c0; } private: double r0; double c0; }; I have found the following post that shows how to initialize 1D vector so I customized my module accordingly ,which a follows #include <systemc> #include <systemc-ams> using namespace sc_core; SC_MODULE (rc){ sca_eln::sca_terminal n; sca_eln::sca_terminal p; sca_eln::sca_r r1; sca_eln::sca_c c1; sca_eln::sca_node n1; rc( sc_core::sc_module_name nm , double r0_,double c0_) :p("p"),n("n"), r1("r1"),c1("c1"), r0(r0_),c0(c0_) { r1.p(p); r1.n(n1); r1.value=r0; c1.p(n1); c1.n(n); c1.value=c0; } private: double r0; double c0; }; struct create_mod { double m_arg1; double m_arg2; create_mod(double arg1, double arg2) : m_arg1(arg1), m_arg2(arg2) {} rc* operator()(const char* name, size_t) { return new rc(name, m_arg1, m_arg2); } }; SC_MODULE (rc_tb){ rc rc0; rc_tb( sc_core::sc_module_name nm ):rc0("rc0",1.0,1.0) { unsigned int num_of_rcs = 4; unsigned int r_value = 5, c_value = 4; sc_vector<rc> vec_rc("mods"); vec_rc.init(num_of_rcs, create_mod( r_value, c_value)); //... connect nodes } }; Now the code works But it is only for 1D array This method also forces me to set same argument values for all the initialized submodules ( vec_rc.init(num_of_rcs, create_mod( r_value, c_value)); ). So my 2 questions are 1- How to make it a 2D vectors ? 2- How to initialize each component with specific RC values? I also have tried the code suggested in to make a 2D nested vectors but I failed I don't mind using either methods as long as it does the job. It will be nice if I use lambda function also Thanks in advance RF Quote Link to comment Share on other sites More sharing options...
maehne Posted July 23, 2020 Report Share Posted July 23, 2020 Any two-dimensional array a2d[rows][cols] can be mapped to a one-dimensional array a1d[rows*cols]. Accessing an individual element using row and col requires just mapping the coordinate to the equivalent one-dimensional index i = row * cols + col. If you want to use a nested sc_vector< sc_vector<rc> >, you should adapt the code @Philipp A Hartmann suggested in the second thread, which you mentioned. @T. Zimmermann provided a working example in the same same thread. However, it is not making use of lambda functions to further compact the code. As I wrote in the same thread, you need two element creators, which can be coded on site as lambda functions, one to create an sc_vector for each row and the other to create each rc instance. That creator may pass any additional value besides the module name to the module's constructor. These arguments you have to either fetch from some value array or calculate on the call site. For this, you will have to keep track of the row and col index. The creator of the row vectors gets passed the current index of the row as second argument. The inner creator for the module gets passed the current index within the row, i.e., the col as argument. The current row can be passed to that inner creator by simply capturing it by value (or reference) when defining the lambda function for that inner element creator. An array with component parameters is also best passed through the creators by capturing it by refer I suggest that you make yourself more familiar with Modern C++ and also to have a look at @ralph.goergen's and @Philipp A Hartmann's paper on the topic presented at DVCon Europe 2015. Quote Link to comment Share on other sites More sharing options...
Alaba Posted July 25, 2020 Author Report Share Posted July 25, 2020 Thanks Maehne for the high level design, and the references I will try to implement it, and post it here Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.