15#ifndef SIMICS_SYSTEMC_SC_FACTORY_H
16#define SIMICS_SYSTEMC_SC_FACTORY_H
22#include <simics/cc-api.h>
58 template<
typename SetupFun,
typename TeardownFun>
60 const char *class_doc,
61 SetupFun setup, TeardownFun teardown) {
63 class_doc, setup, teardown));
66 template<
typename SetupFun>
68 const char *class_doc, SetupFun setup) {
73 template<
typename TAdapter,
typename TModelData>
75 std::vector<TModelData*>& models = getRegisteredModels<TModelData>();
76 for (
auto it = models.begin(); it != models.end(); ++it) {
77 TModelData &model = **it;
78 make_class<TAdapter>(model.name(), model.desc(), model.doc(),
87 virtual void setup(
int argc,
char *argv[]) = 0;
91 template<
typename TBase>
95 ModelData(
const char *class_name,
const char *class_desc,
96 const char *class_doc,
97 void (*setup)(
int,
char **),
void (*teardown)())
98 :
ModelData(class_name, class_desc, class_doc,
99 new FactoryVoid(setup, teardown)) {}
102 ModelData(
const char *class_name,
const char *class_desc,
103 const char *class_doc,
104 void (*setup)(
int,
char **))
105 :
ModelData(class_name, class_desc, class_doc,
106 new FactoryVoid(setup, nullptr)) {}
110 ModelData(
const char *class_name,
const char *class_desc,
111 const char *class_doc,
112 T *(*setup)(
int,
char **),
void (*teardown)(T *))
113 :
ModelData(class_name, class_desc, class_doc,
114 new Factory<T>(setup, teardown)) {}
118 ModelData(
const char *class_name,
const char *class_desc,
119 const char *class_doc,
120 T *(*setup)(
int,
char **))
121 :
ModelData(class_name, class_desc, class_doc,
122 new Factory<T>(setup, nullptr)) {}
134 const std::string &
name()
const {
return name_; }
135 const std::string &
desc()
const {
return desc_; }
136 const std::string &
doc()
const {
return doc_; }
140 ModelData(
const char *class_name,
const char *class_desc,
142 : name_(class_name), desc_(class_desc), doc_(class_doc),
148 FactoryInterface *factory_;
153 template<
typename TModelData>
155 getRegisteredModels<TModelData>().push_back(model_data);
163 class Factory :
public FactoryInterface {
165 typedef T* (*SetupFun)(int,
char **);
166 typedef void (*TeardownFun)(T *);
168 Factory(SetupFun setup, TeardownFun teardown)
169 : setup_(setup), teardown_(teardown), setup_data_(nullptr) {}
172 void setup(
int argc,
char *argv[])
override {
173 setup_data_ = setup_(argc, argv);
175 void teardown()
override {
177 teardown_(setup_data_);
184 TeardownFun teardown_;
188 class FactoryVoid :
public FactoryInterface {
190 typedef void (*SetupFun)(int,
char **);
191 typedef void (*TeardownFun)();
193 FactoryVoid(SetupFun setup, TeardownFun teardown)
194 : setup_(setup), teardown_(teardown) {}
197 void setup(
int argc,
char *argv[])
override {
200 void teardown()
override {
209 TeardownFun teardown_;
212 template<
typename TModelData>
213 static std::vector<TModelData*>& getRegisteredModels() {
214 static std::vector<TModelData*> models;
static void set_module_name(const char *module_name)
Definition: sc_factory.h:84
virtual void setup(int argc, char *argv[])=0
virtual ~FactoryInterface()
Definition: sc_factory.h:86
virtual void teardown()=0
Definition: sc_factory.h:92
ModelData(const char *class_name, const char *class_desc, const char *class_doc, T *(*setup)(int, char **))
Definition: sc_factory.h:118
ModelData(const char *class_name, const char *class_desc, const char *class_doc, T *(*setup)(int, char **), void(*teardown)(T *))
Definition: sc_factory.h:110
ModelData(const char *class_name, const char *class_desc, const char *class_doc, void(*setup)(int, char **), void(*teardown)())
Definition: sc_factory.h:95
ModelData(const ModelData &)=delete
const std::string & doc() const
Definition: sc_factory.h:136
const ModelData & operator=(const ModelData &)=delete
const std::string & desc() const
Definition: sc_factory.h:135
~ModelData()
Definition: sc_factory.h:124
ModelData(const char *class_name, const char *class_desc, const char *class_doc, void(*setup)(int, char **))
Definition: sc_factory.h:102
FactoryInterface * factory() const
Definition: sc_factory.h:137
const std::string & name() const
Definition: sc_factory.h:134
Utility class to help register a setup and teardown function for the SystemC top-model with Simics.
Definition: sc_factory.h:56
static void registerWithFramework()
Definition: sc_factory.h:74
RegisterModel(const char *class_name, const char *class_desc, const char *class_doc, SetupFun setup)
Definition: sc_factory.h:67
RegisterModel(const char *class_name, const char *class_desc, const char *class_doc, SetupFun setup, TeardownFun teardown)
Definition: sc_factory.h:59
static void addModelData(TModelData *model_data)
Definition: sc_factory.h:154
RegisterModel()
Definition: sc_factory.h:152
Definition: pci_bus_interface.h:24