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