1 /* Copyright (c) 2012 Massachusetts Institute of Technology
3 * Permission is hereby granted, free of charge, to any person obtaining a copy
4 * of this software and associated documentation files (the "Software"), to deal
5 * in the Software without restriction, including without limitation the rights
6 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 * copies of the Software, and to permit persons to whom the Software is
8 * furnished to do so, subject to the following conditions:
10 * The above copyright notice and this permission notice shall be included in
11 * all copies or substantial portions of the Software.
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 #include "model/ModelGen.h"
26 #include "model/Model.h"
28 #include "model/std_cells/StdCell.h"
29 #include "model/std_cells/INV.h"
30 #include "model/std_cells/NAND2.h"
31 #include "model/std_cells/NOR2.h"
32 #include "model/std_cells/MUX2.h"
33 #include "model/std_cells/XOR2.h"
34 #include "model/std_cells/DFFQ.h"
35 #include "model/std_cells/LATQ.h"
36 #include "model/std_cells/ADDF.h"
37 #include "model/std_cells/OR2.h"
38 #include "model/std_cells/AND2.h"
39 #include "model/std_cells/BUF.h"
40 // Electrical functional units
41 #include "model/electrical/TestModel.h"
42 #include "model/electrical/RippleAdder.h"
43 #include "model/electrical/Multiplexer.h"
44 #include "model/electrical/MultiplexerCrossbar.h"
45 #include "model/electrical/OR.h"
46 #include "model/electrical/Decoder.h"
47 #include "model/electrical/DFFRAM.h"
48 #include "model/electrical/MatrixArbiter.h"
49 #include "model/electrical/SeparableAllocator.h"
50 #include "model/electrical/router/Router.h"
51 #include "model/electrical/RepeatedLink.h"
52 #include "model/electrical/BroadcastHTree.h"
53 // Optical functional units
54 #include "model/optical/OpticalLinkBackendTx.h"
55 #include "model/optical/OpticalLinkBackendRx.h"
56 #include "model/optical/SWMRLink.h"
57 #include "model/optical/SWSRLink.h"
58 #include "model/optical/LaserSource.h"
59 #include "model/optical/ThrottledLaserSource.h"
60 #include "model/optical/RingModulator.h"
61 #include "model/optical/RingDetector.h"
63 #include "model/network/ElectricalMesh.h"
64 #include "model/network/ElectricalClos.h"
65 #include "model/network/PhotonicClos.h"
72 //TODO: Eventually automate the creation of this file
74 Model
* ModelGen::createModel(const String
& model_name_
, const String
& instance_name_
, const TechModel
* tech_model_
)
76 Log::printLine("ModelGen::createModel -> " + model_name_
);
78 if("INV" == model_name_
)
80 return new INV(instance_name_
, tech_model_
);
82 else if("NAND2" == model_name_
)
84 return new NAND2(instance_name_
, tech_model_
);
86 else if("NOR2" == model_name_
)
88 return new NOR2(instance_name_
, tech_model_
);
90 else if("MUX2" == model_name_
)
92 return new MUX2(instance_name_
, tech_model_
);
94 else if("XOR2" == model_name_
)
96 return new XOR2(instance_name_
, tech_model_
);
98 else if("DFFQ" == model_name_
)
100 return new DFFQ(instance_name_
, tech_model_
);
102 else if("LATQ" == model_name_
)
104 return new LATQ(instance_name_
, tech_model_
);
106 else if("ADDF" == model_name_
)
108 return new ADDF(instance_name_
, tech_model_
);
110 else if("OR2" == model_name_
)
112 return new OR2(instance_name_
, tech_model_
);
114 else if("AND2" == model_name_
)
116 return new AND2(instance_name_
, tech_model_
);
118 else if("BUF" == model_name_
)
120 return new BUF(instance_name_
, tech_model_
);
122 else if("TestModel" == model_name_
)
124 return new TestModel(instance_name_
, tech_model_
);
126 else if("RippleAdder" == model_name_
)
128 return new RippleAdder(instance_name_
, tech_model_
);
130 else if("Multiplexer" == model_name_
)
132 return new Multiplexer(instance_name_
, tech_model_
);
134 else if("OR" == model_name_
)
136 return new OR(instance_name_
, tech_model_
);
138 else if("MultiplexerCrossbar" == model_name_
)
140 return new MultiplexerCrossbar(instance_name_
, tech_model_
);
142 else if("Decoder" == model_name_
)
144 return new Decoder(instance_name_
, tech_model_
);
146 else if("DFFRAM" == model_name_
)
148 return new DFFRAM(instance_name_
, tech_model_
);
150 else if("MatrixArbiter" == model_name_
)
152 return new MatrixArbiter(instance_name_
, tech_model_
);
154 else if("SeparableAllocator" == model_name_
)
156 return new SeparableAllocator(instance_name_
, tech_model_
);
158 else if("Router" == model_name_
)
160 return new Router(instance_name_
, tech_model_
);
162 else if("OpticalLinkBackendTx" == model_name_
)
164 return new OpticalLinkBackendTx(instance_name_
, tech_model_
);
166 else if("OpticalLinkBackendRx" == model_name_
)
168 return new OpticalLinkBackendRx(instance_name_
, tech_model_
);
170 else if("SWMRLink" == model_name_
)
172 return new SWMRLink(instance_name_
, tech_model_
);
174 else if("SWSRLink" == model_name_
)
176 return new SWSRLink(instance_name_
, tech_model_
);
178 else if("LaserSource" == model_name_
)
180 return new LaserSource(instance_name_
, tech_model_
);
182 else if("ThrottledLaserSource" == model_name_
)
184 return new ThrottledLaserSource(instance_name_
, tech_model_
);
186 else if("RingModulator" == model_name_
)
188 return new RingModulator(instance_name_
, tech_model_
);
190 else if("RingDetector" == model_name_
)
192 return new RingDetector(instance_name_
, tech_model_
);
194 else if("RepeatedLink" == model_name_
)
196 return new RepeatedLink(instance_name_
, tech_model_
);
198 else if("BroadcastHTree" == model_name_
)
200 return new BroadcastHTree(instance_name_
, tech_model_
);
202 else if("ElectricalMesh" == model_name_
)
204 return new ElectricalMesh(instance_name_
, tech_model_
);
206 else if("ElectricalClos" == model_name_
)
208 return new ElectricalClos(instance_name_
, tech_model_
);
210 else if("PhotonicClos" == model_name_
)
212 return new PhotonicClos(instance_name_
, tech_model_
);
216 const String
& error_msg
= "[Error] Invalid model name (" + model_name_
+ ")";
217 throw Exception(error_msg
);
223 StdCell
* ModelGen::createStdCell(const String
& std_cell_name_
, const String
& instance_name_
, const TechModel
* tech_model_
)
225 Log::printLine("ModelGen::createStdCell -> " + std_cell_name_
);
227 if("INV" == std_cell_name_
)
229 return new INV(instance_name_
, tech_model_
);
231 else if("NAND2" == std_cell_name_
)
233 return new NAND2(instance_name_
, tech_model_
);
235 else if("NOR2" == std_cell_name_
)
237 return new NOR2(instance_name_
, tech_model_
);
239 else if("MUX2" == std_cell_name_
)
241 return new MUX2(instance_name_
, tech_model_
);
243 else if("XOR2" == std_cell_name_
)
245 return new XOR2(instance_name_
, tech_model_
);
247 else if("DFFQ" == std_cell_name_
)
249 return new DFFQ(instance_name_
, tech_model_
);
251 else if("LATQ" == std_cell_name_
)
253 return new LATQ(instance_name_
, tech_model_
);
255 else if("ADDF" == std_cell_name_
)
257 return new ADDF(instance_name_
, tech_model_
);
259 else if("OR2" == std_cell_name_
)
261 return new OR2(instance_name_
, tech_model_
);
263 else if("AND2" == std_cell_name_
)
265 return new AND2(instance_name_
, tech_model_
);
267 else if("BUF" == std_cell_name_
)
269 return new BUF(instance_name_
, tech_model_
);
273 const String
& error_msg
= "[Error] Invalid Standard Cell name (" + std_cell_name_
+ ")";
274 throw Exception(error_msg
);
280 ElectricalModel
* ModelGen::createRAM(const String
& ram_name_
, const String
& instance_name_
, const TechModel
* tech_model_
)
282 Log::printLine("ModelGen::createRAM -> " + ram_name_
);
284 if("DFFRAM" == ram_name_
)
286 return new DFFRAM(instance_name_
, tech_model_
);
290 const String
& error_msg
= "[Error] Invalid RAM name (" + ram_name_
+ ")";
291 throw Exception(error_msg
);
297 ElectricalModel
* ModelGen::createCrossbar(const String
& crossbar_name_
, const String
& instance_name_
, const TechModel
* tech_model_
)
299 Log::printLine("ModelGen::createCrossbar -> " + crossbar_name_
);
301 if("MultiplexerCrossbar" == crossbar_name_
)
303 return new MultiplexerCrossbar(instance_name_
, tech_model_
);
307 const String
& error_msg
= "[Error] Invalid Crossbar name (" + crossbar_name_
+ ")";
308 throw Exception(error_msg
);
313 //-----------------------------------------------------------------
315 void ModelGen::printAvailableModels()
317 // TODO: Need more descriptions
318 cout
<< "INV NAND2 NOR2 MUX2 XOR2 DFFQ LATQ ADDF OR2 AND2 BUF" << endl
;
319 cout
<< "RippleAdder Multiplexer OR RepeatedLink BroadcastHTree" << endl
;
320 cout
<< "MultiplexerCrossbar Decoder DFFRAM MatrixArbiter SeparableAllocator Router" << endl
;
321 cout
<< "OpticalLinkBackendTx OpticalLinkBackendRx SWMRLink SWSRLink" << endl
;
322 cout
<< "LaserSource ThrottledLaserSource RingModulator RingDetector" << endl
;
323 cout
<< "ElectricalMesh ElectricalClos PhotonicClos" << endl
;