110448Snilay@cs.wisc.edu/* Copyright (c) 2012 Massachusetts Institute of Technology 210448Snilay@cs.wisc.edu * 310448Snilay@cs.wisc.edu * Permission is hereby granted, free of charge, to any person obtaining a copy 410448Snilay@cs.wisc.edu * of this software and associated documentation files (the "Software"), to deal 510448Snilay@cs.wisc.edu * in the Software without restriction, including without limitation the rights 610448Snilay@cs.wisc.edu * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 710448Snilay@cs.wisc.edu * copies of the Software, and to permit persons to whom the Software is 810448Snilay@cs.wisc.edu * furnished to do so, subject to the following conditions: 910448Snilay@cs.wisc.edu * 1010448Snilay@cs.wisc.edu * The above copyright notice and this permission notice shall be included in 1110448Snilay@cs.wisc.edu * all copies or substantial portions of the Software. 1210448Snilay@cs.wisc.edu * 1310448Snilay@cs.wisc.edu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1410448Snilay@cs.wisc.edu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1510448Snilay@cs.wisc.edu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1610448Snilay@cs.wisc.edu * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1710448Snilay@cs.wisc.edu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 1810448Snilay@cs.wisc.edu * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 1910448Snilay@cs.wisc.edu * THE SOFTWARE. 2010448Snilay@cs.wisc.edu */ 2110448Snilay@cs.wisc.edu 2210447Snilay@cs.wisc.edu#include "model/ModelGen.h" 2310447Snilay@cs.wisc.edu 2410447Snilay@cs.wisc.edu#include <iostream> 2510447Snilay@cs.wisc.edu 2610447Snilay@cs.wisc.edu#include "model/Model.h" 2710447Snilay@cs.wisc.edu// Standard cells 2810447Snilay@cs.wisc.edu#include "model/std_cells/StdCell.h" 2910447Snilay@cs.wisc.edu#include "model/std_cells/INV.h" 3010447Snilay@cs.wisc.edu#include "model/std_cells/NAND2.h" 3110447Snilay@cs.wisc.edu#include "model/std_cells/NOR2.h" 3210447Snilay@cs.wisc.edu#include "model/std_cells/MUX2.h" 3310447Snilay@cs.wisc.edu#include "model/std_cells/XOR2.h" 3410447Snilay@cs.wisc.edu#include "model/std_cells/DFFQ.h" 3510447Snilay@cs.wisc.edu#include "model/std_cells/LATQ.h" 3610447Snilay@cs.wisc.edu#include "model/std_cells/ADDF.h" 3710447Snilay@cs.wisc.edu#include "model/std_cells/OR2.h" 3810447Snilay@cs.wisc.edu#include "model/std_cells/AND2.h" 3910447Snilay@cs.wisc.edu#include "model/std_cells/BUF.h" 4010447Snilay@cs.wisc.edu// Electrical functional units 4110447Snilay@cs.wisc.edu#include "model/electrical/TestModel.h" 4210447Snilay@cs.wisc.edu#include "model/electrical/RippleAdder.h" 4310447Snilay@cs.wisc.edu#include "model/electrical/Multiplexer.h" 4410447Snilay@cs.wisc.edu#include "model/electrical/MultiplexerCrossbar.h" 4510447Snilay@cs.wisc.edu#include "model/electrical/OR.h" 4610447Snilay@cs.wisc.edu#include "model/electrical/Decoder.h" 4710447Snilay@cs.wisc.edu#include "model/electrical/DFFRAM.h" 4810447Snilay@cs.wisc.edu#include "model/electrical/MatrixArbiter.h" 4910447Snilay@cs.wisc.edu#include "model/electrical/SeparableAllocator.h" 5010447Snilay@cs.wisc.edu#include "model/electrical/router/Router.h" 5110447Snilay@cs.wisc.edu#include "model/electrical/RepeatedLink.h" 5210447Snilay@cs.wisc.edu#include "model/electrical/BroadcastHTree.h" 5310447Snilay@cs.wisc.edu// Optical functional units 5410447Snilay@cs.wisc.edu#include "model/optical/OpticalLinkBackendTx.h" 5510447Snilay@cs.wisc.edu#include "model/optical/OpticalLinkBackendRx.h" 5610447Snilay@cs.wisc.edu#include "model/optical/SWMRLink.h" 5710447Snilay@cs.wisc.edu#include "model/optical/SWSRLink.h" 5810447Snilay@cs.wisc.edu#include "model/optical/LaserSource.h" 5910447Snilay@cs.wisc.edu#include "model/optical/ThrottledLaserSource.h" 6010447Snilay@cs.wisc.edu#include "model/optical/RingModulator.h" 6110447Snilay@cs.wisc.edu#include "model/optical/RingDetector.h" 6210447Snilay@cs.wisc.edu// Networks 6310447Snilay@cs.wisc.edu#include "model/network/ElectricalMesh.h" 6410447Snilay@cs.wisc.edu#include "model/network/ElectricalClos.h" 6510447Snilay@cs.wisc.edu#include "model/network/PhotonicClos.h" 6610447Snilay@cs.wisc.edu 6710447Snilay@cs.wisc.edunamespace DSENT 6810447Snilay@cs.wisc.edu{ 6910447Snilay@cs.wisc.edu using std::cout; 7010447Snilay@cs.wisc.edu using std::endl; 7110447Snilay@cs.wisc.edu 7210447Snilay@cs.wisc.edu //TODO: Eventually automate the creation of this file 7310447Snilay@cs.wisc.edu 7410447Snilay@cs.wisc.edu Model* ModelGen::createModel(const String& model_name_, const String& instance_name_, const TechModel* tech_model_) 7510447Snilay@cs.wisc.edu { 7610447Snilay@cs.wisc.edu Log::printLine("ModelGen::createModel -> " + model_name_); 7710447Snilay@cs.wisc.edu 7810447Snilay@cs.wisc.edu if("INV" == model_name_) 7910447Snilay@cs.wisc.edu { 8010447Snilay@cs.wisc.edu return new INV(instance_name_, tech_model_); 8110447Snilay@cs.wisc.edu } 8210447Snilay@cs.wisc.edu else if("NAND2" == model_name_) 8310447Snilay@cs.wisc.edu { 8410447Snilay@cs.wisc.edu return new NAND2(instance_name_, tech_model_); 8510447Snilay@cs.wisc.edu } 8610447Snilay@cs.wisc.edu else if("NOR2" == model_name_) 8710447Snilay@cs.wisc.edu { 8810447Snilay@cs.wisc.edu return new NOR2(instance_name_, tech_model_); 8910447Snilay@cs.wisc.edu } 9010447Snilay@cs.wisc.edu else if("MUX2" == model_name_) 9110447Snilay@cs.wisc.edu { 9210447Snilay@cs.wisc.edu return new MUX2(instance_name_, tech_model_); 9310447Snilay@cs.wisc.edu } 9410447Snilay@cs.wisc.edu else if("XOR2" == model_name_) 9510447Snilay@cs.wisc.edu { 9610447Snilay@cs.wisc.edu return new XOR2(instance_name_, tech_model_); 9710447Snilay@cs.wisc.edu } 9810447Snilay@cs.wisc.edu else if("DFFQ" == model_name_) 9910447Snilay@cs.wisc.edu { 10010447Snilay@cs.wisc.edu return new DFFQ(instance_name_, tech_model_); 10110447Snilay@cs.wisc.edu } 10210447Snilay@cs.wisc.edu else if("LATQ" == model_name_) 10310447Snilay@cs.wisc.edu { 10410447Snilay@cs.wisc.edu return new LATQ(instance_name_, tech_model_); 10510447Snilay@cs.wisc.edu } 10610447Snilay@cs.wisc.edu else if("ADDF" == model_name_) 10710447Snilay@cs.wisc.edu { 10810447Snilay@cs.wisc.edu return new ADDF(instance_name_, tech_model_); 10910447Snilay@cs.wisc.edu } 11010447Snilay@cs.wisc.edu else if("OR2" == model_name_) 11110447Snilay@cs.wisc.edu { 11210447Snilay@cs.wisc.edu return new OR2(instance_name_, tech_model_); 11310447Snilay@cs.wisc.edu } 11410447Snilay@cs.wisc.edu else if("AND2" == model_name_) 11510447Snilay@cs.wisc.edu { 11610447Snilay@cs.wisc.edu return new AND2(instance_name_, tech_model_); 11710447Snilay@cs.wisc.edu } 11810447Snilay@cs.wisc.edu else if("BUF" == model_name_) 11910447Snilay@cs.wisc.edu { 12010447Snilay@cs.wisc.edu return new BUF(instance_name_, tech_model_); 12110447Snilay@cs.wisc.edu } 12210447Snilay@cs.wisc.edu else if("TestModel" == model_name_) 12310447Snilay@cs.wisc.edu { 12410447Snilay@cs.wisc.edu return new TestModel(instance_name_, tech_model_); 12510447Snilay@cs.wisc.edu } 12610447Snilay@cs.wisc.edu else if("RippleAdder" == model_name_) 12710447Snilay@cs.wisc.edu { 12810447Snilay@cs.wisc.edu return new RippleAdder(instance_name_, tech_model_); 12910447Snilay@cs.wisc.edu } 13010447Snilay@cs.wisc.edu else if("Multiplexer" == model_name_) 13110447Snilay@cs.wisc.edu { 13210447Snilay@cs.wisc.edu return new Multiplexer(instance_name_, tech_model_); 13310447Snilay@cs.wisc.edu } 13410447Snilay@cs.wisc.edu else if("OR" == model_name_) 13510447Snilay@cs.wisc.edu { 13610447Snilay@cs.wisc.edu return new OR(instance_name_, tech_model_); 13710447Snilay@cs.wisc.edu } 13810447Snilay@cs.wisc.edu else if("MultiplexerCrossbar" == model_name_) 13910447Snilay@cs.wisc.edu { 14010447Snilay@cs.wisc.edu return new MultiplexerCrossbar(instance_name_, tech_model_); 14110447Snilay@cs.wisc.edu } 14210447Snilay@cs.wisc.edu else if("Decoder" == model_name_) 14310447Snilay@cs.wisc.edu { 14410447Snilay@cs.wisc.edu return new Decoder(instance_name_, tech_model_); 14510447Snilay@cs.wisc.edu } 14610447Snilay@cs.wisc.edu else if("DFFRAM" == model_name_) 14710447Snilay@cs.wisc.edu { 14810447Snilay@cs.wisc.edu return new DFFRAM(instance_name_, tech_model_); 14910447Snilay@cs.wisc.edu } 15010447Snilay@cs.wisc.edu else if("MatrixArbiter" == model_name_) 15110447Snilay@cs.wisc.edu { 15210447Snilay@cs.wisc.edu return new MatrixArbiter(instance_name_, tech_model_); 15310447Snilay@cs.wisc.edu } 15410447Snilay@cs.wisc.edu else if("SeparableAllocator" == model_name_) 15510447Snilay@cs.wisc.edu { 15610447Snilay@cs.wisc.edu return new SeparableAllocator(instance_name_, tech_model_); 15710447Snilay@cs.wisc.edu } 15810447Snilay@cs.wisc.edu else if("Router" == model_name_) 15910447Snilay@cs.wisc.edu { 16010447Snilay@cs.wisc.edu return new Router(instance_name_, tech_model_); 16110447Snilay@cs.wisc.edu } 16210447Snilay@cs.wisc.edu else if("OpticalLinkBackendTx" == model_name_) 16310447Snilay@cs.wisc.edu { 16410447Snilay@cs.wisc.edu return new OpticalLinkBackendTx(instance_name_, tech_model_); 16510447Snilay@cs.wisc.edu } 16610447Snilay@cs.wisc.edu else if("OpticalLinkBackendRx" == model_name_) 16710447Snilay@cs.wisc.edu { 16810447Snilay@cs.wisc.edu return new OpticalLinkBackendRx(instance_name_, tech_model_); 16910447Snilay@cs.wisc.edu } 17010447Snilay@cs.wisc.edu else if("SWMRLink" == model_name_) 17110447Snilay@cs.wisc.edu { 17210447Snilay@cs.wisc.edu return new SWMRLink(instance_name_, tech_model_); 17310447Snilay@cs.wisc.edu } 17410447Snilay@cs.wisc.edu else if("SWSRLink" == model_name_) 17510447Snilay@cs.wisc.edu { 17610447Snilay@cs.wisc.edu return new SWSRLink(instance_name_, tech_model_); 17710447Snilay@cs.wisc.edu } 17810447Snilay@cs.wisc.edu else if("LaserSource" == model_name_) 17910447Snilay@cs.wisc.edu { 18010447Snilay@cs.wisc.edu return new LaserSource(instance_name_, tech_model_); 18110447Snilay@cs.wisc.edu } 18210447Snilay@cs.wisc.edu else if("ThrottledLaserSource" == model_name_) 18310447Snilay@cs.wisc.edu { 18410447Snilay@cs.wisc.edu return new ThrottledLaserSource(instance_name_, tech_model_); 18510447Snilay@cs.wisc.edu } 18610447Snilay@cs.wisc.edu else if("RingModulator" == model_name_) 18710447Snilay@cs.wisc.edu { 18810447Snilay@cs.wisc.edu return new RingModulator(instance_name_, tech_model_); 18910447Snilay@cs.wisc.edu } 19010447Snilay@cs.wisc.edu else if("RingDetector" == model_name_) 19110447Snilay@cs.wisc.edu { 19210447Snilay@cs.wisc.edu return new RingDetector(instance_name_, tech_model_); 19310447Snilay@cs.wisc.edu } 19410447Snilay@cs.wisc.edu else if("RepeatedLink" == model_name_) 19510447Snilay@cs.wisc.edu { 19610447Snilay@cs.wisc.edu return new RepeatedLink(instance_name_, tech_model_); 19710447Snilay@cs.wisc.edu } 19810447Snilay@cs.wisc.edu else if("BroadcastHTree" == model_name_) 19910447Snilay@cs.wisc.edu { 20010447Snilay@cs.wisc.edu return new BroadcastHTree(instance_name_, tech_model_); 20110447Snilay@cs.wisc.edu } 20210447Snilay@cs.wisc.edu else if("ElectricalMesh" == model_name_) 20310447Snilay@cs.wisc.edu { 20410447Snilay@cs.wisc.edu return new ElectricalMesh(instance_name_, tech_model_); 20510447Snilay@cs.wisc.edu } 20610447Snilay@cs.wisc.edu else if("ElectricalClos" == model_name_) 20710447Snilay@cs.wisc.edu { 20810447Snilay@cs.wisc.edu return new ElectricalClos(instance_name_, tech_model_); 20910447Snilay@cs.wisc.edu } 21010447Snilay@cs.wisc.edu else if("PhotonicClos" == model_name_) 21110447Snilay@cs.wisc.edu { 21210447Snilay@cs.wisc.edu return new PhotonicClos(instance_name_, tech_model_); 21310447Snilay@cs.wisc.edu } 21410447Snilay@cs.wisc.edu else 21510447Snilay@cs.wisc.edu { 21610447Snilay@cs.wisc.edu const String& error_msg = "[Error] Invalid model name (" + model_name_ + ")"; 21710447Snilay@cs.wisc.edu throw Exception(error_msg); 21810447Snilay@cs.wisc.edu return NULL; 21910447Snilay@cs.wisc.edu } 22010447Snilay@cs.wisc.edu return NULL; 22110447Snilay@cs.wisc.edu } 22210447Snilay@cs.wisc.edu 22310447Snilay@cs.wisc.edu StdCell* ModelGen::createStdCell(const String& std_cell_name_, const String& instance_name_, const TechModel* tech_model_) 22410447Snilay@cs.wisc.edu { 22510447Snilay@cs.wisc.edu Log::printLine("ModelGen::createStdCell -> " + std_cell_name_); 22610447Snilay@cs.wisc.edu 22710447Snilay@cs.wisc.edu if("INV" == std_cell_name_) 22810447Snilay@cs.wisc.edu { 22910447Snilay@cs.wisc.edu return new INV(instance_name_, tech_model_); 23010447Snilay@cs.wisc.edu } 23110447Snilay@cs.wisc.edu else if("NAND2" == std_cell_name_) 23210447Snilay@cs.wisc.edu { 23310447Snilay@cs.wisc.edu return new NAND2(instance_name_, tech_model_); 23410447Snilay@cs.wisc.edu } 23510447Snilay@cs.wisc.edu else if("NOR2" == std_cell_name_) 23610447Snilay@cs.wisc.edu { 23710447Snilay@cs.wisc.edu return new NOR2(instance_name_, tech_model_); 23810447Snilay@cs.wisc.edu } 23910447Snilay@cs.wisc.edu else if("MUX2" == std_cell_name_) 24010447Snilay@cs.wisc.edu { 24110447Snilay@cs.wisc.edu return new MUX2(instance_name_, tech_model_); 24210447Snilay@cs.wisc.edu } 24310447Snilay@cs.wisc.edu else if("XOR2" == std_cell_name_) 24410447Snilay@cs.wisc.edu { 24510447Snilay@cs.wisc.edu return new XOR2(instance_name_, tech_model_); 24610447Snilay@cs.wisc.edu } 24710447Snilay@cs.wisc.edu else if("DFFQ" == std_cell_name_) 24810447Snilay@cs.wisc.edu { 24910447Snilay@cs.wisc.edu return new DFFQ(instance_name_, tech_model_); 25010447Snilay@cs.wisc.edu } 25110447Snilay@cs.wisc.edu else if("LATQ" == std_cell_name_) 25210447Snilay@cs.wisc.edu { 25310447Snilay@cs.wisc.edu return new LATQ(instance_name_, tech_model_); 25410447Snilay@cs.wisc.edu } 25510447Snilay@cs.wisc.edu else if("ADDF" == std_cell_name_) 25610447Snilay@cs.wisc.edu { 25710447Snilay@cs.wisc.edu return new ADDF(instance_name_, tech_model_); 25810447Snilay@cs.wisc.edu } 25910447Snilay@cs.wisc.edu else if("OR2" == std_cell_name_) 26010447Snilay@cs.wisc.edu { 26110447Snilay@cs.wisc.edu return new OR2(instance_name_, tech_model_); 26210447Snilay@cs.wisc.edu } 26310447Snilay@cs.wisc.edu else if("AND2" == std_cell_name_) 26410447Snilay@cs.wisc.edu { 26510447Snilay@cs.wisc.edu return new AND2(instance_name_, tech_model_); 26610447Snilay@cs.wisc.edu } 26710447Snilay@cs.wisc.edu else if("BUF" == std_cell_name_) 26810447Snilay@cs.wisc.edu { 26910447Snilay@cs.wisc.edu return new BUF(instance_name_, tech_model_); 27010447Snilay@cs.wisc.edu } 27110447Snilay@cs.wisc.edu else 27210447Snilay@cs.wisc.edu { 27310447Snilay@cs.wisc.edu const String& error_msg = "[Error] Invalid Standard Cell name (" + std_cell_name_ + ")"; 27410447Snilay@cs.wisc.edu throw Exception(error_msg); 27510447Snilay@cs.wisc.edu return NULL; 27610447Snilay@cs.wisc.edu } 27710447Snilay@cs.wisc.edu return NULL; 27810447Snilay@cs.wisc.edu } 27910447Snilay@cs.wisc.edu 28010447Snilay@cs.wisc.edu ElectricalModel* ModelGen::createRAM(const String& ram_name_, const String& instance_name_, const TechModel* tech_model_) 28110447Snilay@cs.wisc.edu { 28210447Snilay@cs.wisc.edu Log::printLine("ModelGen::createRAM -> " + ram_name_); 28310447Snilay@cs.wisc.edu 28410447Snilay@cs.wisc.edu if("DFFRAM" == ram_name_) 28510447Snilay@cs.wisc.edu { 28610447Snilay@cs.wisc.edu return new DFFRAM(instance_name_, tech_model_); 28710447Snilay@cs.wisc.edu } 28810447Snilay@cs.wisc.edu else 28910447Snilay@cs.wisc.edu { 29010447Snilay@cs.wisc.edu const String& error_msg = "[Error] Invalid RAM name (" + ram_name_ + ")"; 29110447Snilay@cs.wisc.edu throw Exception(error_msg); 29210447Snilay@cs.wisc.edu return NULL; 29310447Snilay@cs.wisc.edu } 29410447Snilay@cs.wisc.edu return NULL; 29510447Snilay@cs.wisc.edu } 29610447Snilay@cs.wisc.edu 29710447Snilay@cs.wisc.edu ElectricalModel* ModelGen::createCrossbar(const String& crossbar_name_, const String& instance_name_, const TechModel* tech_model_) 29810447Snilay@cs.wisc.edu { 29910447Snilay@cs.wisc.edu Log::printLine("ModelGen::createCrossbar -> " + crossbar_name_); 30010447Snilay@cs.wisc.edu 30110447Snilay@cs.wisc.edu if("MultiplexerCrossbar" == crossbar_name_) 30210447Snilay@cs.wisc.edu { 30310447Snilay@cs.wisc.edu return new MultiplexerCrossbar(instance_name_, tech_model_); 30410447Snilay@cs.wisc.edu } 30510447Snilay@cs.wisc.edu else 30610447Snilay@cs.wisc.edu { 30710447Snilay@cs.wisc.edu const String& error_msg = "[Error] Invalid Crossbar name (" + crossbar_name_ + ")"; 30810447Snilay@cs.wisc.edu throw Exception(error_msg); 30910447Snilay@cs.wisc.edu return NULL; 31010447Snilay@cs.wisc.edu } 31110447Snilay@cs.wisc.edu return NULL; 31210447Snilay@cs.wisc.edu } 31310447Snilay@cs.wisc.edu //----------------------------------------------------------------- 31410447Snilay@cs.wisc.edu 31510447Snilay@cs.wisc.edu void ModelGen::printAvailableModels() 31610447Snilay@cs.wisc.edu { 31710447Snilay@cs.wisc.edu // TODO: Need more descriptions 31810447Snilay@cs.wisc.edu cout << "INV NAND2 NOR2 MUX2 XOR2 DFFQ LATQ ADDF OR2 AND2 BUF" << endl; 31910447Snilay@cs.wisc.edu cout << "RippleAdder Multiplexer OR RepeatedLink BroadcastHTree" << endl; 32010447Snilay@cs.wisc.edu cout << "MultiplexerCrossbar Decoder DFFRAM MatrixArbiter SeparableAllocator Router" << endl; 32110447Snilay@cs.wisc.edu cout << "OpticalLinkBackendTx OpticalLinkBackendRx SWMRLink SWSRLink" << endl; 32210447Snilay@cs.wisc.edu cout << "LaserSource ThrottledLaserSource RingModulator RingDetector" << endl; 32310447Snilay@cs.wisc.edu cout << "ElectricalMesh ElectricalClos PhotonicClos" << endl; 32410447Snilay@cs.wisc.edu return; 32510447Snilay@cs.wisc.edu } 32610447Snilay@cs.wisc.edu} // namespace DSENT 32710447Snilay@cs.wisc.edu 328