ModelGen.cc revision 10447:a465576671d4
1#include "model/ModelGen.h"
2
3#include <iostream>
4
5#include "model/Model.h"
6// Standard cells
7#include "model/std_cells/StdCell.h"
8#include "model/std_cells/INV.h"
9#include "model/std_cells/NAND2.h"
10#include "model/std_cells/NOR2.h"
11#include "model/std_cells/MUX2.h"
12#include "model/std_cells/XOR2.h"
13#include "model/std_cells/DFFQ.h"
14#include "model/std_cells/LATQ.h"
15#include "model/std_cells/ADDF.h"
16#include "model/std_cells/OR2.h"
17#include "model/std_cells/AND2.h"
18#include "model/std_cells/BUF.h"
19// Electrical functional units
20#include "model/electrical/TestModel.h"
21#include "model/electrical/RippleAdder.h"
22#include "model/electrical/Multiplexer.h"
23#include "model/electrical/MultiplexerCrossbar.h"
24#include "model/electrical/OR.h"
25#include "model/electrical/Decoder.h"
26#include "model/electrical/DFFRAM.h"
27#include "model/electrical/MatrixArbiter.h"
28#include "model/electrical/SeparableAllocator.h"
29#include "model/electrical/router/Router.h"
30#include "model/electrical/RepeatedLink.h"
31#include "model/electrical/BroadcastHTree.h"
32// Optical functional units
33#include "model/optical/OpticalLinkBackendTx.h"
34#include "model/optical/OpticalLinkBackendRx.h"
35#include "model/optical/SWMRLink.h"
36#include "model/optical/SWSRLink.h"
37#include "model/optical/LaserSource.h"
38#include "model/optical/ThrottledLaserSource.h"
39#include "model/optical/RingModulator.h"
40#include "model/optical/RingDetector.h"
41// Networks
42#include "model/network/ElectricalMesh.h"
43#include "model/network/ElectricalClos.h"
44#include "model/network/PhotonicClos.h"
45
46namespace DSENT
47{
48    using std::cout;
49    using std::endl;
50
51    //TODO: Eventually automate the creation of this file
52
53    Model* ModelGen::createModel(const String& model_name_, const String& instance_name_, const TechModel* tech_model_)
54    {
55        Log::printLine("ModelGen::createModel -> " + model_name_);
56
57        if("INV" == model_name_)
58        {
59            return new INV(instance_name_, tech_model_);
60        }
61        else if("NAND2" == model_name_)
62        {
63            return new NAND2(instance_name_, tech_model_);
64        }
65        else if("NOR2" == model_name_)
66        {
67            return new NOR2(instance_name_, tech_model_);
68        }
69        else if("MUX2" == model_name_)
70        {
71            return new MUX2(instance_name_, tech_model_);
72        }
73        else if("XOR2" == model_name_)
74        {
75            return new XOR2(instance_name_, tech_model_);
76        }
77        else if("DFFQ" == model_name_)
78        {
79            return new DFFQ(instance_name_, tech_model_);
80        }
81        else if("LATQ" == model_name_)
82        {
83            return new LATQ(instance_name_, tech_model_);
84        }
85        else if("ADDF" == model_name_)
86        {
87            return new ADDF(instance_name_, tech_model_);
88        }
89        else if("OR2" == model_name_)
90        {
91            return new OR2(instance_name_, tech_model_);
92        }
93        else if("AND2" == model_name_)
94        {
95            return new AND2(instance_name_, tech_model_);
96        }
97        else if("BUF" == model_name_)
98        {
99            return new BUF(instance_name_, tech_model_);
100        }
101        else if("TestModel" == model_name_)
102        {
103            return new TestModel(instance_name_, tech_model_);
104        }
105        else if("RippleAdder" == model_name_)
106        {
107            return new RippleAdder(instance_name_, tech_model_);
108        }
109        else if("Multiplexer" == model_name_)
110        {
111            return new Multiplexer(instance_name_, tech_model_);
112        }
113        else if("OR" == model_name_)
114        {
115            return new OR(instance_name_, tech_model_);
116        }
117        else if("MultiplexerCrossbar" == model_name_)
118        {
119            return new MultiplexerCrossbar(instance_name_, tech_model_);
120        }
121        else if("Decoder" == model_name_)
122        {
123            return new Decoder(instance_name_, tech_model_);
124        }
125        else if("DFFRAM" == model_name_)
126        {
127            return new DFFRAM(instance_name_, tech_model_);
128        }
129        else if("MatrixArbiter" == model_name_)
130        {
131            return new MatrixArbiter(instance_name_, tech_model_);
132        }
133        else if("SeparableAllocator" == model_name_)
134        {
135            return new SeparableAllocator(instance_name_, tech_model_);
136        }
137        else if("Router" == model_name_)
138        {
139            return new Router(instance_name_, tech_model_);
140        }
141        else if("OpticalLinkBackendTx" == model_name_)
142        {
143            return new OpticalLinkBackendTx(instance_name_, tech_model_);
144        }
145        else if("OpticalLinkBackendRx" == model_name_)
146        {
147            return new OpticalLinkBackendRx(instance_name_, tech_model_);
148        }
149        else if("SWMRLink" == model_name_)
150        {
151            return new SWMRLink(instance_name_, tech_model_);
152        }
153        else if("SWSRLink" == model_name_)
154        {
155            return new SWSRLink(instance_name_, tech_model_);
156        }
157        else if("LaserSource" == model_name_)
158        {
159            return new LaserSource(instance_name_, tech_model_);
160        }
161        else if("ThrottledLaserSource" == model_name_)
162        {
163            return new ThrottledLaserSource(instance_name_, tech_model_);
164        }
165        else if("RingModulator" == model_name_)
166        {
167            return new RingModulator(instance_name_, tech_model_);
168        }
169        else if("RingDetector" == model_name_)
170        {
171            return new RingDetector(instance_name_, tech_model_);
172        }
173        else if("RepeatedLink" == model_name_)
174        {
175            return new RepeatedLink(instance_name_, tech_model_);
176        }
177        else if("BroadcastHTree" == model_name_)
178        {
179            return new BroadcastHTree(instance_name_, tech_model_);
180        }
181        else if("ElectricalMesh" == model_name_)
182        {
183            return new ElectricalMesh(instance_name_, tech_model_);
184        }
185        else if("ElectricalClos" == model_name_)
186        {
187            return new ElectricalClos(instance_name_, tech_model_);
188        }
189        else if("PhotonicClos" == model_name_)
190        {
191            return new PhotonicClos(instance_name_, tech_model_);
192        }
193        else
194        {
195            const String& error_msg = "[Error] Invalid model name (" + model_name_ + ")";
196            throw Exception(error_msg);
197            return NULL;
198        }
199        return NULL;
200    }
201
202    StdCell* ModelGen::createStdCell(const String& std_cell_name_, const String& instance_name_, const TechModel* tech_model_)
203    {
204        Log::printLine("ModelGen::createStdCell -> " + std_cell_name_);
205
206        if("INV" == std_cell_name_)
207        {
208            return new INV(instance_name_, tech_model_);
209        }
210        else if("NAND2" == std_cell_name_)
211        {
212            return new NAND2(instance_name_, tech_model_);
213        }
214        else if("NOR2" == std_cell_name_)
215        {
216            return new NOR2(instance_name_, tech_model_);
217        }
218        else if("MUX2" == std_cell_name_)
219        {
220            return new MUX2(instance_name_, tech_model_);
221        }
222        else if("XOR2" == std_cell_name_)
223        {
224            return new XOR2(instance_name_, tech_model_);
225        }
226        else if("DFFQ" == std_cell_name_)
227        {
228            return new DFFQ(instance_name_, tech_model_);
229        }
230        else if("LATQ" == std_cell_name_)
231        {
232            return new LATQ(instance_name_, tech_model_);
233        }
234        else if("ADDF" == std_cell_name_)
235        {
236            return new ADDF(instance_name_, tech_model_);
237        }
238        else if("OR2" == std_cell_name_)
239        {
240            return new OR2(instance_name_, tech_model_);
241        }
242        else if("AND2" == std_cell_name_)
243        {
244            return new AND2(instance_name_, tech_model_);
245        }
246        else if("BUF" == std_cell_name_)
247        {
248            return new BUF(instance_name_, tech_model_);
249        }
250        else
251        {
252            const String& error_msg = "[Error] Invalid Standard Cell name (" + std_cell_name_ + ")";
253            throw Exception(error_msg);
254            return NULL;
255        }
256        return NULL;
257    }
258
259    ElectricalModel* ModelGen::createRAM(const String& ram_name_, const String& instance_name_, const TechModel* tech_model_)
260    {
261        Log::printLine("ModelGen::createRAM -> " + ram_name_);
262
263        if("DFFRAM" == ram_name_)
264        {
265            return new DFFRAM(instance_name_, tech_model_);
266        }
267        else
268        {
269            const String& error_msg = "[Error] Invalid RAM name (" + ram_name_ + ")";
270            throw Exception(error_msg);
271            return NULL;
272        }
273        return NULL;
274    }
275
276    ElectricalModel* ModelGen::createCrossbar(const String& crossbar_name_, const String& instance_name_, const TechModel* tech_model_)
277    {
278        Log::printLine("ModelGen::createCrossbar -> " + crossbar_name_);
279
280        if("MultiplexerCrossbar" == crossbar_name_)
281        {
282            return new MultiplexerCrossbar(instance_name_, tech_model_);
283        }
284        else
285        {
286            const String& error_msg = "[Error] Invalid Crossbar name (" + crossbar_name_ + ")";
287            throw Exception(error_msg);
288            return NULL;
289        }
290        return NULL;
291    }
292    //-----------------------------------------------------------------
293
294    void ModelGen::printAvailableModels()
295    {
296        // TODO: Need more descriptions
297        cout << "INV NAND2 NOR2 MUX2 XOR2 DFFQ LATQ ADDF OR2 AND2 BUF" << endl;
298        cout << "RippleAdder Multiplexer OR RepeatedLink BroadcastHTree" << endl;
299        cout << "MultiplexerCrossbar Decoder DFFRAM MatrixArbiter SeparableAllocator Router" << endl;
300        cout << "OpticalLinkBackendTx OpticalLinkBackendRx SWMRLink SWSRLink" << endl;
301        cout << "LaserSource ThrottledLaserSource RingModulator RingDetector" << endl;
302        cout << "ElectricalMesh ElectricalClos PhotonicClos" << endl;
303        return;
304    }
305} // namespace DSENT
306
307