The usual way of using templated code is to put all code in .h, having template code emitted when used in main C++ file.
This is good for utility libraries (like STL), but SystemC modules may be more than 1000 lines long, and more that 40 of them may be used in one topcell. This may yield a single translation unit with more than 50000 lines of code, heavily templated.
This implies some usability issues:
Therefore we need two features in the build-system:
Support for separate implementation and declaration:
Put template class definition (.h) and implementation (.cpp) in two separate files. Compile the implementation separately.
This implies that the C++ templates must be explicitly instanciated with some template class ns::Foo<parameters>; code.
As we can’t predict all the template parameters that will be used for all modules, template instanciation has to be done automatically.
Object reuse: Once modules are built separately, we can put objects in a global repository and use the in a cached way. This can shorted compile times across different topcells using the same modules with the same parameters.
When modules are compiled, object files resulting from their compilation are put in a separate temporary repos directory where file names are indexed depending on:
This way, when the same module is used in the same context, its object files may be already present, and reused without recompilation of big C++ code.
User sometimes needs to debug just one module. Soclib-cc includes support for such an usage with its debug mode. This permits to have just one module compiled with no optimization and debug symbols, with the rest of simulator running optimized code.
This can be either done with:
When debug mode is activated, module is compiled with debug flags turned on, and also has the preprocessor macro SOCLIB_MODULE_DEBUG defined.