Jump to content
enchanter

How to pass modified Template argument to sub module?

Recommended Posts

I have a top level module with template like this:

template <int TOP_DEPTH=10>
SC_MODULE(my_top){}

And I have several sub modules like this:

template <int DEPTH=10>
SC_MODULE(sub_module_xxx>

I try to instantiate sub modules with the modified DEPTH from top level:

const int DEPTH_MODULE_A = <math1 on TOP_DEPTH>
const int DEPTH_MODULE_B = <math2 on TOP_DEPTH>
...

sub_module_a<DEPTH_MODULE_A> *pSubModuleA;
sub_module_b<DEPTH_MODULE_B> *pSubModuleB;
...



I got compile error about  "invalid use of non-static data member". 

 

I am not sure what's the right way to do it in C++. 

(I don't want DEPTH_MODULE_xxx to be static, because my top_module may be used as submodule in other project with different value of TOP_DEPTH. )

Share this post


Link to post
Share on other sites

I have a top level module with template like this:

template <int TOP_DEPTH=10>
SC_MODULE(my_top){}

And I have several sub modules like this:

template <int DEPTH=10>
SC_MODULE(sub_module_xxx>

I try to instantiate sub modules with the modified DEPTH from top level:

const int DEPTH_MODULE_A = <math1 on TOP_DEPTH>
const int DEPTH_MODULE_B = <math2 on TOP_DEPTH>
...

sub_module_a<DEPTH_MODULE_A> *pSubModuleA;
sub_module_b<DEPTH_MODULE_B> *pSubModuleB;
...



I got compile error about  "invalid use of non-static data member". 

 

I am not sure what's the right way to do it in C++. 

(I don't want DEPTH_MODULE_xxx to be static, because my top_module may be used as submodule in other project with different value of TOP_DEPTH. )

Hello Sir,

Please look up some good reference on C++ BEFORE working with

SystemC. Static members of class may be initilaized in the constructor

initialization list. Also, a class with a modified template argument is not

a sub-class of a given super-class. Please familiarize yourself with all

the core features of C++ before venturing into SystemC. Hope that

helps.

Share this post


Link to post
Share on other sites
I am not sure what's the right way to do it in C++. 

(I don't want DEPTH_MODULE_xxx to be static, because my top_module may be used as submodule in other project with different value of TOP_DEPTH. )

 

I don't understand, why using the top module with different values of TOP_DEPTH is a showstopper for declaring the DEPTH_MODULE_xxx as static members of my_top.

 

Integer template arguments have to be known at compile-time in order to instantiate the correct type.  Would something like the following be sufficient for your situation?

 

template <int DEPTH=10>
SC_MODULE(sub_module_xxx);

template <int TOP_DEPTH=10>
SC_MODULE(my_top)
{
  static const int depth = TOP_DEPTH; // I usually forward template constants to proper member constants

  static const int depth_a = depth + 1; // or other math on depth
  static const int depth_b = depth / 2; // ...

  sub_module_a<depth_a> sub_a; // no need for pointers?
  sub_module_b<depth_b> sub_b;

  SC_CTOR(my_top)
    : sub_a("sub_a") // initialize sub-modules
    , sub_b("sub_b")
  {}
};

int sc_main(int, char*[])
{
  my_top<17> t1("t1");
  my_top<42> t2("t2");

  sc_assert( t1.depth == 17 && t1.depth_a == 18 );
  sc_assert( t2.depth == 42 && t2.depth_b == 21 );
  return 0;
}

Greetings from Oldenburg,

  Philipp

Share this post


Link to post
Share on other sites

Hi Philipp:

 

Thanks for your reply. The solution works perfect for me. 

 

But from my very basic C++ knowledge, I think 'static' means share the variable with all the instances of the class. So that means the 't1' and 't2' should share 'depth', 'depth_a', and 'depth_b'. And the 'const' means no one can change it. Then I am confused that how could 't1' and 't2' get different value of 'depth' and 'depth_x'?

 

 

Share this post


Link to post
Share on other sites

Hi Philipp:

 

Thanks for your reply. The solution works perfect for me. 

 

But from my very basic C++ knowledge, I think 'static' means share the variable with all the instances of the class. So that means the 't1' and 't2' should share 'depth', 'depth_a', and 'depth_b'. And the 'const' means no one can change it. Then I am confused that how could 't1' and 't2' get different value of 'depth' and 'depth_x'?

Hello Sir,

I am afraid you should look up a good reference on C++. A public static member of a class can

be used by all instances(objects), so that even if an instance of its containing class is NOT created,

the static member to be used. Please check a good C++ reference -- good things do not come

easy. Hope that helps.

Share this post


Link to post
Share on other sites

But from my very basic C++ knowledge, I think 'static' means share the variable with all the instances of the class. So that means the 't1' and 't2' should share 'depth', 'depth_a', and 'depth_b'. And the 'const' means no one can change it. Then I am confused that how could 't1' and 't2' get different value of 'depth' and 'depth_x'?

 

Yes, static members are shared among all instances of a class. But, a class template is more like a recipe to build classes. The instances of a class template are all different classes.

The static members of "t1" and "t2" can differ, because t1 and t2 are instances of different classes (my_top<17> and my_top<42>).  These classes just happen to both have static constants named depth, etc. as they are cooked (instantiated) from the same recipe (template).

 

/Philipp

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×