SystemC Library API Reference Manual
Reference documentation for the Simics SystemC Library.
 
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules
Loading...
Searching...
No Matches
sc_factory.h
Go to the documentation of this file.
1/* -*- C++ -*-
2
3 © 2015 Intel Corporation
4
5 This software and the related documents are Intel copyrighted materials, and
6 your use of them is governed by the express license under which they were
7 provided to you ("License"). Unless the License provides otherwise, you may
8 not use, modify, copy, publish, distribute, disclose or transmit this software
9 or the related documents without Intel's prior written permission.
10
11 This software and the related documents are provided as is, with no express or
12 implied warranties, other than those that are expressly stated in the License.
13*/
14
15#ifndef SIMICS_SYSTEMC_SC_FACTORY_H
16#define SIMICS_SYSTEMC_SC_FACTORY_H
17
18// The following two class_decorator inclusions must be before cc-api.h
21
22#include <simics/cc-api.h>
23
25
26#include <string>
27#include <vector>
28
29namespace simics {
30namespace systemc {
31
57 public:
58 template<typename SetupFun, typename TeardownFun>
59 RegisterModel(const char *class_name, const char *class_desc,
60 const char *class_doc,
61 SetupFun setup, TeardownFun teardown) {
62 addModelData(new ModelData<RegisterModel>(class_name, class_desc,
63 class_doc, setup, teardown));
64 }
65
66 template<typename SetupFun>
67 RegisterModel(const char *class_name, const char *class_desc,
68 const char *class_doc, SetupFun setup) {
69 addModelData(new ModelData<RegisterModel>(class_name, class_desc,
70 class_doc, setup));
71 }
72
73 template<typename TAdapter, typename TModelData>
74 static void registerWithFramework() {
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(),
79 model.factory());
80 }
81 }
82
85 public:
86 virtual ~FactoryInterface() {}
87 virtual void setup(int argc, char *argv[]) = 0;
88 virtual void teardown() = 0;
89 };
90
91 template<typename TBase>
92 class ModelData {
93 public:
94 // Setup/teardown without return/argument
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)) {}
100
101 // Only setup without return value, no 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)) {}
107
108 // Setup/teardown with arbitrary return/argument pointer
109 template<typename T>
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)) {}
115
116 // Setup only with arbitrary return pointer (needed?)
117 template<typename T>
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)) {}
123
125 // Actually this will never be deleted as ModelData objects are
126 // held in a vector throughout the simulation time
127 delete factory_;
128 }
129
130 // Non-copyable
131 ModelData(const ModelData &) = delete;
132 const ModelData &operator=(const ModelData&) = delete;
133
134 const std::string &name() const { return name_; }
135 const std::string &desc() const { return desc_; }
136 const std::string &doc() const { return doc_; }
137 FactoryInterface *factory() const { return factory_; }
138
139 private:
140 ModelData(const char *class_name, const char *class_desc,
141 const char *class_doc, FactoryInterface *factory)
142 : name_(class_name), desc_(class_desc), doc_(class_doc),
143 factory_(factory) {}
144
145 std::string name_;
146 std::string desc_;
147 std::string doc_;
148 FactoryInterface *factory_;
149 };
150
151 protected:
153 template<typename TModelData>
154 static void addModelData(TModelData *model_data) {
155 getRegisteredModels<TModelData>().push_back(model_data);
156#ifdef MODULE_NAME
158#endif
159 }
160
161 private:
162 template<typename T>
163 class Factory : public FactoryInterface {
164 public:
165 typedef T* (*SetupFun)(int, char **);
166 typedef void (*TeardownFun)(T *);
167
168 Factory(SetupFun setup, TeardownFun teardown)
169 : setup_(setup), teardown_(teardown), setup_data_(nullptr) {}
170
171 // FactoryInterface
172 void setup(int argc, char *argv[]) override {
173 setup_data_ = setup_(argc, argv);
174 }
175 void teardown() override {
176 if (teardown_) {
177 teardown_(setup_data_);
178 teardown_ = nullptr;
179 }
180 }
181
182 private:
183 SetupFun setup_;
184 TeardownFun teardown_;
185 T *setup_data_;
186 };
187
188 class FactoryVoid : public FactoryInterface {
189 public:
190 typedef void (*SetupFun)(int, char **);
191 typedef void (*TeardownFun)();
192
193 FactoryVoid(SetupFun setup, TeardownFun teardown)
194 : setup_(setup), teardown_(teardown) {}
195
196 // FactoryInterface
197 void setup(int argc, char *argv[]) override {
198 setup_(argc, argv);
199 }
200 void teardown() override {
201 if (teardown_) {
202 teardown_();
203 teardown_ = nullptr;
204 }
205 }
206
207 private:
208 SetupFun setup_;
209 TeardownFun teardown_;
210 };
211
212 template<typename TModelData>
213 static std::vector<TModelData*>& getRegisteredModels() {
214 static std::vector<TModelData*> models;
215 return models;
216 }
217};
218
219} // namespace systemc
220} // namespace simics
221
222#endif
static void set_module_name(const char *module_name)
virtual void setup(int argc, char *argv[])=0
virtual ~FactoryInterface()
Definition: sc_factory.h:86
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